Python列表推导式与pandas索引筛选的行为差异及正确写法咨询
底层原理说明
in操作符在pandas Series和Python原生序列上的行为逻辑存在本质差异:
- 对Python原生的列表、元组等结构,
x in 序列会判断x是否为序列的元素值 - 对pandas Series结构,
x in Series默认判断x是否属于Series的索引标签,而非元素值
你示例中的ser2使用默认生成的整数索引[0,1,2,3,4],因此列表推导式执行判断时,1、2、3、4都存在于ser2的索引中,只有5不存在,最终得到不符合预期的结果[5]。
列表推导式修正方案
只需要将判断对象改为Series的元素值集合即可,有两种等效写法:
- 调用
values属性获取值数组:
[x for x in ser1 if x not in ser2.values]
- 调用
tolist()方法转成Python列表后判断:
[x for x in ser1 if x not in ser2.tolist()]
两种写法运行后都能得到和ser1[~ser1.isin(ser2)]一致的正确结果[1,2,3]。
内容的提问来源于stack exchange,提问作者Anne
相关产品推荐
相关产品推荐

