如何实现SQL语言的IN
和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'])]
但这看起来像是一个可怕的杂技。有人能改进它吗?
发布于 2013-11-14 01:13:40
您可以使用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
发布于 2017-07-19 20:19:40
使用.query()方法的替代解决方案:
In [5]: df.query("countries in @countries_to_keep")
Out[5]:
countries
1 UK
3 China
In [6]: df.query("countries not in @countries_to_keep")
Out[6]:
countries
0 US
2 Germany
发布于 2013-11-14 01:14:32
我通常会像这样对行进行通用过滤:
criterion = lambda row: row['countries'] not in countries
not_in = df[df.apply(criterion, axis=1)]
https://stackoverflow.com/questions/19960077
复制相似问题