Pandas如何实现整数列类似str.contains的列表值筛选?
问题原因
- 直接报错的核心原因:pandas的
.str访问器仅支持字符串类型的Series对象调用,你的ID列存储的是整数类型值,直接调用该访问器必然触发AttributeError。 - 底层逻辑选型错误:
str.contains的作用是做字符串子串模糊匹配,根本不适配「判断值是否属于给定整数列表」的精确匹配场景。
注意:不要为了套用str.contains强行把整数ID列转为字符串类型,该方案不仅存在不必要的类型转换性能损耗,还会因为子串匹配逻辑出现误判——比如ID为151的员工会被误匹配到bonus列表中的1513,导致筛选结果错误。
解决方案
针对整数类型列的列表成员判断,直接用pandas内置的isin()方法即可,该方法底层做了C级优化,哪怕待匹配的ID列表规模很大,运行效率也很高,完全满足筛选需求。
完整可运行代码如下:
# 待发放奖金的员工ID列表 bonus = [1513, 5454, 6545, 3425, 32424, 2341, 3424, 4568, 4812] # 构造双条件筛选规则:ID在奖金列表内 + 薪资小于5000 filter_mask = df["ID"].isin(bonus) & (df["SALARY"] < 5000) # 提取符合条件的数据,仅保留ID、SALARY两列 bonus_employees = df.loc[filter_mask, ["ID", "SALARY"]]
性能优化提示
如果实际业务中待匹配的bonus列表规模达到万级/十万级以上,可以先把列表转为集合类型再传入isin(),能进一步压缩判断耗时,写法调整为:
filter_mask = df["ID"].isin(set(bonus)) & (df["SALARY"] < 5000)
运行后得到的输出格式和预期完全一致,示例如下:
ID SALARY 0 1513 2933 1 3424 2500 2 3425 1542 3 2341 3600
内容的提问来源于stack exchange,提问作者Jorge Villa
相关产品推荐
相关产品推荐

