683

INSQLとに相当するものをどのように達成できますNOT INか?

必要な値のリストがあります。シナリオは次のとおりです。

df = pd.DataFrame({'country': ['US', 'UK', 'Germany', 'China']})
countries_to_keep = ['UK', 'China']

# pseudo-code:
df[df['country'] not in countries_to_keep]

これを行う私の現在の方法は次のとおりです。

df = pd.DataFrame({'country': ['US', 'UK', 'Germany', 'China']})
df2 = pd.DataFrame({'country': ['UK', 'China'], 'matched': True})

# IN
df.merge(df2, how='inner', on='country')

# NOT IN
not_in = df.merge(df2, how='left', on='country')
not_in = not_in[pd.isnull(not_in['matched'])]

しかし、これは恐ろしいクラッジのようです。誰でもそれを改善できますか?

4

11 に答える 11

1239

使用できますpd.Series.isin

「IN」使用の場合:something.isin(somewhere)

または「NOT IN」の場合:~something.isin(somewhere)

実際の例として:

import pandas as pd

>>> df
  country
0        US
1        UK
2   Germany
3     China
>>> countries_to_keep
['UK', 'China']
>>> df.country.isin(countries_to_keep)
0    False
1     True
2    False
3     True
Name: country, dtype: bool
>>> df[df.country.isin(countries_to_keep)]
  country
1        UK
3     China
>>> df[~df.country.isin(countries_to_keep)]
  country
0        US
2   Germany
于 2013-11-13T17:13:39.863 に答える
18

私は通常、次のような行に対して一般的なフィルタリングを行ってきました。

criterion = lambda row: row['countries'] not in countries
not_in = df[df.apply(criterion, axis=1)]
于 2013-11-13T17:14:32.250 に答える