pandas在多个列上搜索子字符串

2024-10-01 00:33:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个这样的df

       c_name  f_name 
0      abc     abc12  
1      xyz     abc1  
2      mnq     mnq2

目标是在两列之间找到一个子串,并知道它属于哪一列。首选项应该是c_name,就像如果子串在两列中,那么c_name将优先于例如:如果我在上面的数据框中搜索abc,那么我应该以某种方式为c_name获得第0行abc,为{}获得第1行abc1。在

为了解决这个问题我从 df[df['c_name'].str.contains('abc', case=False)] 这将给出c_name的结果。现在的问题是如何排除那些在f_name上执行相同操作的结果的行。非常感谢任何帮助!在


Tags: 数据name目标df方式abc首选项contains
3条回答
import pandas as pd
row  =[['abcx','abcy'],
       ['efg','abcz'],
       ['higj','UK']]
df= pd.DataFrame(row)
df.columns = ['c_name', 'f_name']

print df[df['c_name'].str.contains('abc', case=False)]

delta_df =df[~df['c_name'].str.contains('abc', case=False)]
print delta_df[delta_df['f_name'].str.contains('abc', case=False)]

输出

^{pr2}$

将第一个搜索结果标记为2。如果新的搜索结果满足,则将覆盖(由1覆盖)。在

  • stack变成一个系列
  • str.contains获取子字符串的真值
  • unstack返回dataframe
  • 子集结果以确保至少一个匹配
  • idxmax(1)得到列中的第一个True

def find_subtext(df, txt):
    contains = df.stack().str.contains(txt).unstack()
    return contains[contains.any(1)].idxmax(1)

^{pr2}$
df.assign(abc=find_subtext(df, 'abc'))

  c_name f_name     abc
0    abc  abc12  c_name
1    xyz   abc1  f_name
2    mnq   mnq2     NaN

相关问题 更多 >