2016-06-17 80 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