「notin」条件に基づいてデータフレームから行を削除する[重複]


97

日付列の値が日付のリストにある場合、パンダのデータフレームから行を削除したいと思います。次のコードは機能しません。

a=['2015-01-01' , '2015-02-01']

df=df[df.datecolumn not in a]

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

ValueError:シリーズの真理値があいまいです。a.empty、a.bool()、a.item()、a.any()、またはa.all()を使用します。

回答:


180

を使用できますpandas.Dataframe.isin

pandas.Dateframe.isin各要素がリスト内にあるかどうかに応じてブール値を返しますa。次に、これをで反転して~に変換TrueFalse、その逆も同様です。

import pandas as pd

a = ['2015-01-01' , '2015-02-01']

df = pd.DataFrame(data={'date':['2015-01-01' , '2015-02-01', '2015-03-01' , '2015-04-01', '2015-05-01' , '2015-06-01']})

print(df)
#         date
#0  2015-01-01
#1  2015-02-01
#2  2015-03-01
#3  2015-04-01
#4  2015-05-01
#5  2015-06-01

df = df[~df['date'].isin(a)]

print(df)
#         date
#2  2015-03-01
#3  2015-04-01
#4  2015-05-01
#5  2015-06-01

7
あなたはおそらくSeries.isin、ではなく、を意味しDataFrame.isinます。df全体ではなく、列を比較しています。
acumenus 2018

33

あなたが使用することができますSeries.isin

df = df[~df.datecolumn.isin(a)]

エラーメッセージは、all()またはany()を使用できることを示唆していますが、結果を単一のブール値に減らしたい場合にのみ役立ちます。ただし、これは、シリーズ内のすべての値のメンバーシップを外部リストに対してテストし、結果をそのまま保持することです(つまり、元のDataFrameをスライスするために使用されるブールシリーズ)。 )。

これについて詳しくは、Gotchasをご覧ください。

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