使用'in'判断Pandas DataFrame列是否存在指定值失效是什么原因?
问题根因
你遇到的不符合预期的结果,本质是对pandas中in操作符的作用逻辑理解偏差导致的:
值 in Series这个语法,检查的是目标值是否存在于Series的索引标签中,而非检查是否存在于Series的存储值中- 你切第一个区间
[0:16]时,得到的子DataFrame的索引是默认继承的原始行号0~15,12刚好在索引范围内,所以12 in L.state返回了True,这只是巧合,和state列本身有没有12没有关联 - 第二个区间切的是
[16:51],得到的子DataFrame的索引是16~50,12不在索引范围内,所以哪怕state列里确实有12这个值,in判断也会返回False
正确实现方式
要判断Series的存储值中是否包含指定值,用以下两种写法都可以:
# 写法1:直接判断等值条件是否有至少一个成立,性能更高 v = (L.state == 12).any() # 写法2:用isin方法,适合同时判断多个目标值的场景 v = L.state.isin([12]).any()
额外优化建议
如果你的最终目标是批量判断每个周期是否出现过state=12,可以不用逐段切片判断,先给每行打周期分组标签,再分组聚合判断,效率更高:
- 先通过
df['cycle_id'] = (df['key'] == 102).cumsum()给每个周期生成唯一分组ID - 再用
df.groupby('cycle_id')['state'].apply(lambda x: (x==12).any())就能一次性得到所有周期的判断结果
内容的提问来源于stack exchange,提问作者kTato
相关产品推荐
相关产品推荐

