如何在 Pandas 中正确使用 isin() 与其他条件联合筛选数据

本文详解 pandas 中 `isin()` 与等值、类型匹配等组合条件的正确用法,重点解决因数据类型不一致(如年份误用字符串 `'2025'` 匹配整数 `2025`)导致筛选结果为空的常见问题。

在使用 Pandas 进行数据筛选时,isin() 是高效判断列值是否属于指定集合的常用方法。但当它与其它条件(如年份等于 2025)组合使用时,数据类型不匹配是最隐蔽也最常导致“返回空 DataFrame”的原因。

例如,以下代码看似合理,却可能返回零条记录:

df.loc[(df['Item Code'].isin(['04901', '04940'])) & (df['Year'] == '2025')]

问题根源在于:若 df['Year'] 列的实际数据类型为 int64(即数值型年份),而你用字符串 '2025' 去比较,Pandas 会执行严格类型匹配——2025 == '2025' 恒为 False,整个布尔索引全为 False,最终返回空结果。

✅ 正确做法是确保比较值的数据类型与列一致:

  • 若 Year 列为整数(推荐且常见):

    df[(df['Item Code'].isin(['04901', '04940'])) & (df['Year'] == 2025)]
  • 更简洁、可读性更强的写法(推荐使用 .eq() 避免括号歧义):

    df[df['Item Code'].isin(['04901', '04940']) & df['Year'].eq(2025)]

⚠️ 注意事项:

  • 永远先检查数据类型:使用 df['Year'].dtype 确认列类型,必要时用 df['Year'] = df['Year'].astype(int) 统一;
  • & 是位运算符,必须用圆括号包裹每个条件(& 优先级高于 == 和 isin()),否则会报 ValueError: The truth value of a Series is ambiguous;
  • 避免混用 loc 和纯布尔索引:除非需同时选行列,否则直接 df[condition] 更简洁高效;
  • 若 Item Code 本身是数值型(如 int),则 isin([4901, 4940]) 才匹配,注意字符串与数字的双重一致性。

总结:Pandas 筛选失效,80% 源于类型不匹配。养成 print(df['Year'].dtype) 和 print(df['Year'].head()) 的调试习惯,能快速定位并修复此类问题。