web-dev-qa-db-ja.com

pandasのデータフレームで「does-not-contain」を検索します

いくつかの検索を行ったが、df["col"].str.contains(Word)でデータフレームをフィルター処理する方法がわかりませんが、逆の方法があるのではないかと思います。そのセットの賛辞でデータフレームをフィルター処理します。例:!(df["col"].str.contains(Word))の効果。

これはDataFrameメソッドで実行できますか?

89
stites

反転(〜)演算子を使用できます(ブール演算子ではないように機能します)。

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

、[new_dfはRHSによって返されたコピーです。

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


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

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

または、

new_df = df[df["col"].str.contains(Word) == False]
170
Andy Hayden

Not(〜)記号にも問題があったので、ここに別の方法を示します StackOverflow thread

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

[適用]と[ラムダ]を使用して、列にリスト内の何かが含まれる行を選択できます。あなたのシナリオ:

df[df["col"].apply(lambda x:x not in [Word1,Word2,Word3])]
7
Arash

上記の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値を取り除き、問題なくコマンドを再試行しました。

6
Shoresh

回答がすでに投稿されていることを望みます

複数の単語と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)]
3
Nursnaaz

Nanselm2の答えに加えて、Falseの代わりに0を使用できます。

df["col"].str.contains(Word)==0
2
U10-Forward