私は私のコードでは、このようなものがあります。しかし逆転、パンダ
df2 = df[df['A'].str.contains("Hello|World")]
を、私はがこんにちはあるいは世界のいずれかを含まないすべての行をしたいです。これを最も効率的にどのように逆転させるのですか?
私は私のコードでは、このようなものがあります。しかし逆転、パンダ
df2 = df[df['A'].str.contains("Hello|World")]
を、私はがこんにちはあるいは世界のいずれかを含まないすべての行をしたいです。これを最も効率的にどのように逆転させるのですか?
あなたはブール値を反転するチルダ~
を使用することができます。
>>> 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")))]
のようなものよりも遅いことがありますが、クロスオーバーがどこにあるかを推測するのは難しいです。
あなたは言葉がないが含まれていることを決定するためにnegative lookahead testを使用できるように.contains()
方法は、正規表現を使用しています。
df['A'].str.contains(r'^(?:(?!Hello|World).)*$')
この表現は、言葉Hello
とWorld
がていない任意の文字列に一致します文字列のどこにあっても見つかります。
デモ:
>>> 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
私は 'C:\ Python27 \ lib \ site-packages \ pandas \ core \ strings.pyになりました:176:UserWarning:このパターンには一致するグループがあります。グループを実際に取得するには、str.extract.'を使います。 – Xodarap777
グループを非キャプチャにしました。 –
畳み込まれたネガティブな折り返しテストよりもはるかに優れています。しかし、Pandas自身の経験はありません。そのため、より速いアプローチが何であるか分かりません。 –
正規表現のルックアラウンドテストにはかなり長い時間がかかっていました(約30秒対20秒)、2つの方法は明らかにわずかな違いがあります(3663K結果と3Gオリジナルからの3504K - – Xodarap777
@DSM私はこの '〜'シンボルを何度も、特にJavaScriptで見たことがあります。 Pythonで見たことがない。正確にはどういう意味ですか? – estebanpdl