pandas中DataFrame列不存在的值使用in判断为何返回True
运行逻辑说明
pandas中对Series对象直接使用in关键字做成员判断时,默认检查的是对象的索引标签,而非存储的元素值,这是返回结果不符合预期的核心原因。
对应测试场景的结果解释:
- 构造的
ids列索引为0-8的连续整数,恰好包含索引标签5,因此执行5 in df['ids']时,实际判断的是「5是否为该Series的索引」,因此返回True,全程没有校验列内存储的元素值。 - 执行
df[df['ids'] == 5]筛选时,逻辑是逐行比对ids列的元素值与5是否相等,由于列内元素确实不包含5,因此返回空DataFrame,结果符合值判断的预期。 - 执行
5 in list(df['ids'])时,Series先被转换为原生Python列表,此时in关键字判断的是列表内存储的元素值,因为元素中没有5,因此正确返回False。
正确的元素值判断方法
如果需要判断某个值是否存在于Series的元素中,不要直接对Series使用in,可以采用以下两种写法:
# 写法1:转为numpy数组后判断 5 in df['ids'].values # 写法2:用pandas内置的isin方法判断 df['ids'].isin([5]).any()
两种写法都会正确返回False。
内容的提问来源于stack exchange,提问作者A.Razavi
相关产品推荐
相关产品推荐

