パンダのDataFrameで「does-not-contain」を検索します


142

私はいくつかの検索を実行しましたが、データフレームをでフィルタリングする方法を理解できませんdf["col"].str.contains(word)が、その逆を行う方法があるかどうか疑問に思っています。そのセットの補完によってデータフレームをフィルタリングします。例:の効果に!(df["col"].str.contains(word))

これはDataFrame方法で行うことができますか?

回答:


264

反転(〜)演算子を使用できます(これはブールデータのnotのように機能します)。

new_df = df[~df["col"].str.contains(word)]

new_dfRHSから返されたコピーはどこにありますか。

containsは正規表現も受け入れます...


上記がValueErrorをスローする場合は、データ型が混在していることが原因である可能性が高いため、次を使用しますna=False

new_df = df[~df["col"].str.contains(word, na=False)]

または、

new_df = df[df["col"].str.contains(word) == False]

1
パーフェクト!私はSQLの正規表現に精通していて、Pythonではそれが違うと思っていましたre.complies。私は、検索をオーバーフィットし、それはあなたが言うだけのようだように見えますが。)
stites

6
多分完全な例が役立つでしょう:df[~df.col.str.contains(word)]単語に一致する除外された行を含む元のデータフレームのコピーを返します。
Dennis Golomazov 2017年

45

not(〜)記号にも問題があったため、別のStackOverflowスレッドからの別の方法を次に示します

df[df["col"].str.contains('this|that')==False]

このように組み合わせることができますか?df[df["col1"].str.contains('this'|'that')==False and df["col2"].str.contains('foo'|'bar')==True]?ありがとう!
tommy.carstensen

はい、できます。構文は、ここで説明されていますstackoverflow.com/questions/22086116/...
tommy.carstensen

「|」を含む行をrwmoveする場合は、忘れないでください。次のように「\」を使用する必要があります df = df[~df["col"].str.contains('\|')]
Amir

9

ApplyとLambdaを使用して、リスト内の任意のものが列に含まれる行を選択できます。あなたのシナリオの場合:

df[df["col"].apply(lambda x:x not in [word1,word2,word3])]

6

上記のAndyが推奨するコマンドを使用する前に、NULL値を取り除く必要がありました。例:

df = pd.DataFrame(index = [0, 1, 2], columns=['first', 'second', 'third'])
df.ix[:, 'first'] = 'myword'
df.ix[0, 'second'] = 'myword'
df.ix[2, 'second'] = 'myword'
df.ix[1, 'third'] = 'myword'
df

    first   second  third
0   myword  myword   NaN
1   myword  NaN      myword 
2   myword  myword   NaN

次のコマンドを実行します。

~df["second"].str.contains(word)

次のエラーが発生します。

TypeError: bad operand type for unary ~: 'float'

最初にdropna()またはfillna()を使用してNULL値を削除し、問題なくコマンドを再試行しました。


1
を使用~df["second"].astype(str).str.contains(word)してに強制的に変換することもできstrます。stackoverflow.com/questions/43568760/を
デビッドC

1
@Shoreshこの問題の解決策としてna = Falseを使用することもできます
Vishav Gupta

5

答えが投稿されているといいのですが

複数の単語を見つけてdataFrameからそれらを無効にするフレームワークを追加しています。

ここ'word1','word2','word3','word4'=検索するパターンのリスト

df = DataFrame

column_a = DataFrame dfからの列名

Search_for_These_values = ['word1','word2','word3','word4'] 

pattern = '|'.join(Search_for_These_values)

result = df.loc[~(df['column_a'].str.contains(pattern, case=False)]

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.