
本文详解 pandas 中 `isin()` 与其它条件(如数值比较)联合过滤 dataframe 的常见错误及解决方案,重点解决因数据类型不匹配(如字符串 `'2022'` 误用于整型 `year` 列)导致的空结果问题。
在使用 Pandas 进行数据筛选时,isin() 是高效判断某列值是否属于指定集合的常用方法。但当它与其它条件(如年份等于 2022)组合使用时,极易因数据类型不一致而返回空结果——这正是你遇到问题的根本原因。
你的原始代码如下:
df.loc[(df['Item Code'].isin(['04901', '04940'])) & (df['Year'] == '2022')]
看似逻辑清晰,但若 df['Year'] 列的实际数据类型为 int64(即数值型年份),那么用字符串 '2022' 去比较将永远返回 False,最终整个布尔索引结果全为 False,故返回空 DataFrame。
✅ 正确做法是确保类型严格匹配:
- 若 Year 为整数(最常见情况),应写为 2022(无引号):
df[(df['Item Code'].isin(['04901', '04940'])) & (df['Year'] == 2022)]
- 更推荐使用链式调用与 eq() 方法,语法更清晰、可读性更强,且同样避免隐式类型转换风险:
df[df['Item Code'].isin(['04901', '04940']) & df['Year'].eq(2022)]
? 验证数据类型的小技巧:
运行 df.dtypes 查看各列类型。若发现 Year 显示为 int64 或 float64,则必须用数值比较;若为 object 且实际存的是字符串年份(如 '2022'),才可用 '2022'。必要时可统一转换类型:
df['Year'] = pd.to_numeric(df['Year'], errors='coerce') # 转为数值,异常转为 NaN
⚠️ 注意事项:
- & 是位运算符,必须用括号包裹每个条件(如 (cond1) & (cond2)),否则因运算符优先级会导致语法错误或逻辑错误;
- 避免混用 loc 和纯布尔索引:除非需同时选行列,否则直接 df[boolean_mask] 更简洁高效;
- isin() 支持列表、元组、NumPy 数组等可迭代对象,但不支持单个值(此时应直接用 ==)。
总结:Pandas 筛选失败的“头号杀手”往往是隐形的数据类型错配。养成检查 dtypes、显式指定匹配类型的习惯,能大幅减少此类调试时间。










