2014-01-10 12 views
23

私は私のコードでは、このようなものがあります。しかし逆転、パンダ

df2 = df[df['A'].str.contains("Hello|World")]

を、私はこんにちはあるいは世界のいずれかを含まないすべての行をしたいです。これを最も効率的にどのように逆転させるのですか?

答えて

24

あなたはブール値を反転するチルダ~を使用することができます。

>>> df = pd.DataFrame({"A": ["Hello", "this", "World", "apple"]}) 
>>> df.A.str.contains("Hello|World") 
0  True 
1 False 
2  True 
3 False 
Name: A, dtype: bool 
>>> ~df.A.str.contains("Hello|World") 
0 False 
1  True 
2 False 
3  True 
Name: A, dtype: bool 
>>> df[~df.A.str.contains("Hello|World")] 
     A 
1 this 
3 apple 

[2 rows x 1 columns] 

これが最も効率的な方法であるかどうか、私は知りません。あなたは他のオプションと比較して時間を取らなければならないでしょう。正規表現を使用すると、df[~(df.A.str.contains("Hello") | (df.A.str.contains("World")))]のようなものよりも遅いことがありますが、クロスオーバーがどこにあるかを推測するのは難しいです。

+0

畳み込まれたネガティブな折り返しテストよりもはるかに優れています。しかし、Pandas自身の経験はありません。そのため、より速いアプローチが何であるか分かりません。 –

+1

正規表現のルックアラウンドテストにはかなり長い時間がかかっていました(約30秒対20秒)、2つの方法は明らかにわずかな違いがあります(3663K結果と3Gオリジナルからの3504K - – Xodarap777

+0

@DSM私はこの '〜'シンボルを何度も、特にJavaScriptで見たことがあります。 Pythonで見たことがない。正確にはどういう意味ですか? – estebanpdl

7

あなたは言葉がないが含まれていることを決定するためにnegative lookahead testを使用できるように.contains()方法は、正規表現を使用しています。

df['A'].str.contains(r'^(?:(?!Hello|World).)*$') 

この表現は、言葉HelloWorldていない任意の文字列に一致します文字列のどこにあっても見つかります。

デモ:

>>> df = pd.DataFrame({"A": ["Hello", "this", "World", "apple"]}) 
>>> df['A'].str.contains(r'^(?:(?!Hello|World).)*$') 
0 False 
1  True 
2 False 
3  True 
Name: A, dtype: bool 
>>> df[df['A'].str.contains(r'^(?:(?!Hello|World).)*$')] 
     A 
1 this 
3 apple 
+0

私は 'C:\ Python27 \ lib \ site-packages \ pandas \ core \ strings.pyになりました:176:UserWarning:このパターンには一致するグループがあります。グループを実際に取得するには、str.extract.'を使います。 – Xodarap777

+1

グループを非キャプチャにしました。 –