2017-08-22 19 views
0

私は文章と単語リストを持つパンダシリーズを持っています。リスト内のすべての単語を含むシリーズ内のすべての項目を返したいパンダを返すリストから文字列を含む一連の文字列

例:

sample_list = ['dog', 'cat', 'rat'] 

Series 
0 "I have a dog, a cat, and a rat." 
1 "I only have a dog." 
2 "I only have a cat." 

この例では、最初の行のみが返されます。

現在、リスト内の各単語に対して.str.contains()関数を使用しています。これを行うより効率的な方法はありますか?

ありがとうございました。防弾方法はsample_listを反復処理し、pd.DateFrameコンストラクタを使用して新しいデータフレームを構築する伴うだろう

答えて

0

セットアップ

In [1413]: s 
Out[1413]: 
0 I have a dog, a cat, and a rat. 
1     I only have a dog. 
2     I only have a cat. 
Name: 1, dtype: object 

。次に、あなたの最終的なマスクを取得するためにdf.minを呼び出すことができます。

In [1426]: pd.DataFrame([s.str.contains(x) for x in sample_list]).T.min(axis=1) 
Out[1426]: 
0  True 
1 False 
2 False 
dtype: bool 

はシリーズにboolean indexingを適用します。

In [1427]: idx = pd.DataFrame([s.str.contains(x) for x in sample_list]).T.min(axis=1); s[idx] 
Out[1427]: 
0 I have a dog, a cat, and a rat. 
Name: 1, dtype: object 

あなたはsample_listの単語は、それらの列に同じ順序で表示されることを保証することができる場合regex=Trueとの単一のstr.containsコールを使用することができます。

In [1414]: idx = s.str.contains('.*'.join(sample_list), regex=True); s[idx] 
Out[1414]: 
0 I have a dog, a cat, and a rat. 
Name: 1, dtype: object 
0

これを迅速かつ簡単に行うためには2つのことが必要でした。

pd.Series.apply() 

all() 

どこから:

#apply a function to each row in the series 
#the function returns true iff all the words in sample_list are in the value 
#we use boolean indexing to only return the True values. 
x[x.apply(lambda x: all([y in x for y in sample_list]))] 

返します

0  I have a dog, a cat, and a rat. 
Name: 0, dtype: object 

を必要に応じて。

関連する問題