在本专栏第三篇关于筛选的文章中,总结了isin()。

在工作中我们其实经常要用到isin的反面,isnotin。

在pandas中有isnotin么???

没有。。

没有。。。

没有。。。。

那怎么实现筛选除了某list以外的那些行呢?

这里有几种方法参考一下。

这是这两天翻看之前写的代码,这么长一段只为了实现isnotin。

记得当时也是搜索网络,根据别人的经验写的,现在看来很繁琐。

先是定义一个参考列表,DataFrame里的一列通过tolist()转换为列表,然后将这两个列表都转换成集合set,然后用difference的方法做差集,再将差集转换回列表,然后再用isin进行筛选。

从最好理解的来:

方法一:pandas没有isnotin,我们自己定义一个。

a.定义函数:

b.运用函数:

方法二:使用列表的not in方法 + 简单函数

这种方法类似于第一种,不过更简洁。

方法三:使用merge

a.先将不想要的筛选出来成一个DataFrame

b.将两个DataFrame使用merge合并

c. 通过isnull筛选空值,筛选出我们想要的。

完整的代码就是一行:df[df.merge(df[df['门店'].isin(list1)], how='outer', on='门店')['人员数量_y'].isnull()]

方法四:~

这是一个偏方。一个神奇飘。

df[~df['门店'].isin(list1)]

就完了???

就是这么短。。。。。。。。。。

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

这个神奇的飘飘~,其实是一种运算符,跟加减运算类似。

~ 是做翻转运算。将二进制里的0变成1,把1变成0,而1就是True,0就是False。

我们看看df[~df['门店'].isin(list1)] 的内层 df['门店'].isin(list1)的实质:

df['门店'].isin(list1)的实质是一串(series)True和False,那在前面加~,变成什么了?

在前面加~之后,所有的元素都发生了翻转,True变成了False,False变成了True。

方法五:

df[df['门店'].isin(list1)==False]

原理跟方法四类似,不过更容易理解。

推荐使用这种方法。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐