如何实现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'])]
但这似乎是一个可怕的混乱。有人能改进吗?
使用.query()方法的替代解决方案:
您可以使用^{} 。
用于“IN”用法:
something.isin(somewhere)
或“不在”:
~something.isin(somewhere)
例如:
Pandas提供了两种方法:分别用于序列和数据帧的^{} 和^{} 。
基于一列筛选数据帧(也适用于序列)
最常见的情况是对特定列应用
isin
条件来筛选数据帧中的行。Series.isin
接受各种类型作为输入。以下是获得你想要的一切的有效方法:在许多列上筛选
有时,您会希望对多个列应用带有某些搜索词的“in”成员资格检查
要将
isin
条件应用于“A”和“B”列,请使用DataFrame.isin
:由此,要保留至少有一列是
True
的行,我们可以沿第一个轴使用any
:注意,如果要搜索每一列,只需省略列选择步骤并执行
类似地,若要保留所有列都是
True
的行,请使用与以前相同的方式all
。值得注意的是:
numpy.isin
,query
,列表理解(字符串数据)除了上面描述的方法之外,您还可以使用numpy等价物:^{} 。
为什么值得考虑?由于开销较低,NumPy函数通常比pandas等价函数快一点。由于这是一个不依赖于索引对齐的元素操作,因此很少有情况下此方法不适合替换pandas'
isin
。Pandas例程在处理字符串时通常是迭代的,因为字符串操作很难矢量化。There is a lot of evidence to suggest that list comprehensions will be faster here.。 我们现在要进行一次
in
检查。然而,指定它要困难得多,所以除非你知道自己在做什么,否则不要使用它。
最后,还有
DataFrame.query
,它已经包含在this answer中。新墨西哥自由贸易区!相关问题 更多 >
编程相关推荐