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

2 投票
2 回答
8537 浏览
提问于 2025-05-18 21:17

我想在一个数据表的所有列中查找一个字符串。

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

撰写回答