Как реализовать '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 ответов:
можно использовать
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)]