在Pandas中的多个列上查找字符串

时间:2017-11-08 13:38:26

标签: python pandas

我试图查找跨多个列是否存在字符串。如果字符串存在,我想返回1,如果它不是数据帧中的新系列,则返回0。

在搜索论坛后,我了解str.contains可以使用,但我搜索超过100列,因此我一次只能处理单个系列并不是有效的。

如果相关,则列中有一些NAs。

简化数据框示例:

d = {'strings_1': ['AA', 'AB', 'AV'], 'strings_2': ['BB', 'BA', 'AG'], 
'strings_1': ['AE', 'AC', 'AI'], 'strings_3': ['AA', 'DD', 'PP'], 
'strings_4': ['AV', 'AB', 'BV']}
simple_df = pd.DataFrame(data=d)

如果我有兴趣找到AA' AA'例如,我想返回以下数据帧。

目标数据框示例:

d = {'strings_1': ['AA', 'AB', 'AV'], 'strings_2': ['BB', 'BA', 'AG'], 
'strings_1': ['AE', 'AC', 'AI'], 'strings_3': ['AA', 'DD', 'PP'], 
'strings_4': ['AV', 'AB', 'BV'], 'AA_TRUE': [1, 0, 0]}
target_df = pd.DataFrame(data=d)

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

如果需要检查混合值 - 带字符串的数字比较values创建的numpy数组,请使用DataFrame.any检查每行至少一个True,最后一次转换为int

simple_df['new'] = (simple_df.values == 'AA').any(1).astype(int)
#or cast all values to string before comparing
#simple_df['new'] = (simple_df.astype(str)== 'AA').any(1).astype(int)
print (simple_df)
  strings_1 strings_2 strings_3 strings_4  new
0        AE        BB        AA        AV    1
1        AC        BA        DD        AB    0
2        AI        AG        PP        BV    0

详情:

print ((simple_df.values == 'AA'))
[[False False  True False False]
 [False False False False False]
 [False False False False False]]

print ((simple_df.values == 'AA').any(1))
[ True False False]

如果需要检查子字符串:

simple_df['new'] = simple_df.applymap(lambda x: 'G' in x).any(1).astype(int)
print (simple_df)
  strings_1 strings_2 strings_3 strings_4  new
0        AE        BB        AA        AV    0
1        AC        BA        DD        AB    0
2        AI        AG        PP        BV    1