为何Pandas Series中用in判断元素存在时需使用.values?
问题原因与解决办法
这是Pandas Series的in操作符默认行为导致的:
- 直接用
元素 in Series时,检查的是Series的索引(index)是否包含该元素,而非Series的值(values)。哪怕值里明确存在这个元素,只要索引里没有,就会返回False。 - 而
元素 in Series.values是直接检查底层的numpy数组值,所以能正确匹配到存在的元素。
直观示例验证:
import pandas as pd import numpy as np # 构造索引为字符串、值为numpy.int64类型的Series s = pd.Series([np.int64(10), np.int64(20), np.int64(30)], index=['x', 'y', 'z']) target = np.int64(20) print(target in s) # 输出False(索引里无20) print(target in s.values) # 输出True(值里存在20)
正确检查值存在的写法:
如果要确认元素是否在Series的值中,推荐用更明确的方法,避免依赖in的默认行为:
s.isin([target]).any():返回布尔值,明确检查值是否存在target in s.to_list():将Series转为Python列表后检查值
你可以打印Series.index确认,你要找的numpy.int64元素肯定不在索引里——这就是问题核心,和数据类型无关,哪怕类型完全一致,只要索引不包含该元素,in就会返回False。
内容的提问来源于stack exchange,提问作者Quant1892387
相关产品推荐
相关产品推荐

