2016-06-17 3 views
1

私はストリング値を持つ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']と同じものを返します望んでいるだろうが、それは無効な構文です。私は、dataframeの各シリーズにseries.str.containsメソッドを適用するためにdf.applyを使ってみました。それが実行可能な解決策なら、私はそれを解決することができませんでした。 Linux/Ubuntuではpython 3.5、pandas 0.18を使用しています。

+1

:http://stackoverflow.com/questions/26640129/search-forを-string-in-all-pandas-dataframe-columns-and-filter –

答えて

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 
関連する問題