为何在pandas Series中用in判断整数存在会出现不符合预期的False结果
问题原因
这个异常结果是pandas中in操作符作用于Series时的默认行为和预期不一致导致的:
- 对Python原生列表执行
x in 列表时,检查的是x是否为列表的元素值 - 对pandas的Series执行
x in Series时,默认检查的是x是否存在于Series的**索引(index)**中,而非Series的值列表
你测试用例中的两个DataFrame都使用默认生成的整数索引,索引值为[0,1,2,3]:
- 执行
2 in source_series_1.col_2时,2刚好在索引列表中,因此返回True,和值列表的校验结果巧合一致 - 执行
102 in source_series_2.col_2时,102不在索引列表中,因此返回False,和你预期的值校验结果不符
转成列表后校验符合预期,就是因为列表的in操作回归了值校验的逻辑。
正确的成员校验写法
如果需要判断某个值是否在Series的值列表中,推荐使用以下两种写法:
- 显式访问Series的values属性:
x in series.values - 使用pandas自带的isin方法:
series.isin([x]).any()
对应你的测试场景,示例如下:
import numpy as np import pandas as pd source_series_1 = pd.DataFrame({'col_1': ['a','b','c','d'], 'col_2':np.int64([1, 2, 3, 4])}) source_series_2 = pd.DataFrame({'col_1': ['a','b','c','d'], 'col_2':np.int64([101, 102, 103, 104])}) # 写法1 print(np.int64(2) in source_series_1.col_2.values) # 输出True print(np.int64(102) in source_series_2.col_2.values) # 输出True # 写法2 print(source_series_1.col_2.isin([np.int64(2)]).any()) # 输出True print(source_series_2.col_2.isin([np.int64(102)]).any()) # 输出True
内容的提问来源于stack exchange,提问作者Lawrence LaPointe
相关产品推荐
相关产品推荐

