2016-06-17 57 views
1

我有一个带有字符串值的熊猫数据框,我希望能够返回其中包含某些子字符串的数据框的子集。这是很容易在这样一个系列(例如改编自熊猫文档)做:在包含子串的熊猫数据框中查找值

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

相关:http://stackoverflow.com/questions/26640129/search-for -string-进全大熊猫-数据帧列和过滤器 –

回答

2

另一种解决方案是applycontains

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