在包含子字符串的pandas数据框中查找值

时间:2016-06-17 10:26:47

标签: python string pandas dataframe contains

我有一个带有字符串值的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。

1 个答案:

答案 0 :(得分:2)

另一个解决方案是apply contains

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