web-dev-qa-db-ja.com

string.containsの逆転Pythonでは、pandas

私のコードには次のようなものがあります:

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

ただし、しないのすべての行にHe​​lloまたはWorldのいずれかが含まれている必要があります。これを最も効率的に元に戻すにはどうすればよいですか?

29
Xodarap777

チルド_~_を使用して、ブール値を反転できます。

_>>> 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")))]のようなものよりも遅い場合がありますが、私はクロスオーバーがどこにあるかを推測するのが苦手です。

33
DSM

.contains()メソッドは正規表現を使用するため、 否定先読みテスト を使用して、Wordがでないことを確認できます含まれる:

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

この表現は、HelloおよびWorldである任意の文字列と一致します(== --- ==)not

デモ:

>>> 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
7
Martijn Pieters