我有一个带有字符串值的pandas数据帧,我希望能够返回数据帧的子集,其中值包含一些子字符串。以这种方式对系列很容易做到(例子改编自pandas文档):
import pandas as pd
import numpy as np
s4 = pd.Series(['A', 'B', 'C', 'Aaba', 'Baca', np.nan, 'CABA', 'dog', 'cat'])
s4[s4.str.contains('A', na=False)]
0 A
3 Aaba
6 CABA
dtype: object
我希望在数据帧的所有列中搜索子字符串的工作方式与系列相同,但数据帧没有.str方法。您可以过滤数据帧以获得字符串的完全匹配,如下所示:
df = pd.concat((s4, s4.shift(1)), axis=1)
0 1
0 A NaN
1 B A
2 C B
3 Aaba C
4 Baca Aaba
5 NaN Baca
6 CABA NaN
7 dog CABA
8 cat dog
filtered_df = df[df == 'Baca']
0 1
0 NaN NaN
1 NaN NaN
2 NaN NaN
3 NaN NaN
4 Baca NaN
5 NaN Baca
6 NaN NaN
7 NaN NaN
8 NaN NaN
result = df[df contains 'ac']
我希望这会返回与filtered_df = df[df == 'Baca']
相同的东西,但它的语法无效。我尝试使用df.apply将series.str.contains方法应用于数据帧的每个系列。如果这是一个可行的解决方案,我无法解决这个问题。我在Linux / Ubuntu上使用python 3.5和pandas 0.18。
答案 0 :(得分:2)
mask = df.apply(lambda x: x.str.contains('A', na=False))
print (mask)
0 1
0 True False
1 False True
2 False False
3 True False
4 False True
5 False False
6 True False
7 False True
8 False False
print (df[mask])
0 1
0 A NaN
1 NaN A
2 NaN NaN
3 Aaba NaN
4 NaN Aaba
5 NaN NaN
6 CABA NaN
7 NaN CABA
8 NaN NaN
如果需要检查至少一个True
使用any
:
mask = df.apply(lambda x: x.str.contains('ac', na=False))
print (mask)
0 1
0 False False
1 False False
2 False False
3 False False
4 True False
5 False True
6 False False
7 False False
8 False False
print (mask.any(1))
0 False
1 False
2 False
3 False
4 True
5 True
6 False
7 False
8 False
dtype: bool