Как реализовать 'in' и 'not in' для Pandas dataframe


как я могу достичь эквивалентов SQL IN и NOT IN?

у меня есть список с нужными значениями. Вот сценарий:

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

# pseudo-code:
df[df['countries'] not in countries]

мой нынешний способ сделать это следующим образом:

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

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

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

но это похоже на ужасный Клудж. Может ли кто-нибудь улучшить его?

5 160

5 ответов:

можно использовать pd.Series.isin.

для использования" в":something.isin(somewhere)

или для "не в":~something.isin(somewhere)

как пример:

>>> df
  countries
0        US
1        UK
2   Germany
3     China
>>> countries
['UK', 'China']
>>> df.countries.isin(countries)
0    False
1     True
2    False
3     True
Name: countries, dtype: bool
>>> df[df.countries.isin(countries)]
  countries
1        UK
3     China
>>> df[~df.countries.isin(countries)]
  countries
0        US
2   Germany

альтернативное решение, которое использует .query () способ:

In [5]: df.query("countries in @countries")
Out[5]:
  countries
1        UK
3     China

In [6]: df.query("countries not in @countries")
Out[6]:
  countries
0        US
2   Germany

Я обычно делаю общую фильтрацию по строкам, как это:

criterion = lambda row: row['countries'] not in countries
not_in = df[df.apply(criterion, axis=1)]

Я хотел отфильтровать строки dfbc, которые имели BUSINESS_ID, который также был в BUSINESS_ID dfProfilesBusIds

наконец-то получилось:

dfbc = dfbc[(dfbc['BUSINESS_ID'].isin(dfProfilesBusIds['BUSINESS_ID']) == False)]
df = pd.DataFrame({'countries':['US','UK','Germany','China']})
countries = ['UK','China']

выполнить в:

df[df.countries.isin(countries)]

не реализовать в как в остальных странах:

df[df.countries.isin([x for x in np.unique(df.countries) if x not in countries])]