在Python中搜索数据框所有列中的字符串
我想在一个数据表的所有列中查找一个字符串。
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 个回答
1
这是一种使用名字很贴切的 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])
7
创建一个布尔类型的 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
(子字符串),可以使用 str.contains
方法来处理 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)]
或者可以用 applymap
方法逐个元素检查是否包含某个值,使用 in
来实现:
df = df[df.applymap(lambda x: 'a' in x).any(axis=1)]
print (df)
A B
0 ad b
2 e asw