在Python中搜索数据框的所有列中的字符串

时间:2018-02-18 12:35:43

标签: python pandas dataframe

我试图在数据帧的所有列中找到一个字符串。

import pandas as pd
df = pd.DataFrame([['a', 'b'], ['c', 'd'], ['e', 'a']], columns=["A", "B"])

for col in df:
        df[col].str.contains('a')

0     True
1    False
2    False
Name: A, dtype: bool
0    False
1    False
2     True
Name: B, dtype: bool

但是,上面的代码只返回布尔值而不是我想要的格式(以表格形式显示行和列),这可以在特定列中搜索时实现:

df[df.A == 'a']

   A  B
0  a  b

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:4)

创建布尔DataFrame并按行DataFrame.any检查每行至少一个True并按boolean indexing过滤:

df = df[df.eq('a').any(axis=1)]
print (df)
   A  B
0  a  b
2  e  a

<强>详细

print (df.eq('a'))
       A      B
0   True  False
1  False  False
2  False   True

print(df.eq('a').any(axis=1))
0     True
1    False
2     True
dtype: bool

如果要检查substring,请boolean DataFrame使用df = pd.DataFrame([['ad', 'b'], ['c', 'd'], ['e', 'asw']], columns=["A", "B"]) print (df) A B 0 ad b 1 c d 2 e asw df = df[df.apply(lambda x: x.str.contains('a')).any(axis=1)]

in

str.contains通过df = df[df.applymap(lambda x: 'a' in x).any(axis=1)] print (df) A B 0 ad b 2 e asw 进行明智的检查:

2x + 3y - z >= 2

答案 1 :(得分:0)

这是使用恰当命名的np.logical_or

的一种方式
import pandas as pd, numpy as np

df = pd.DataFrame([['a', 'b'], ['c', 'd'], ['e', 'a']], columns=["A", "B"])

mask = np.logical_or.reduce([df[col] == 'a' for col in df])

df[mask]

#    A  B
# 0  a  b
# 2  e  a

此方法也适用于str.contains。例如:

mask = np.logical_or.reduce([df[col].str.contains('a', na=False) for col in df])