
本文详解如何在pandas中正确结合isin()与其它条件(如年份匹配)进行数据过滤,重点解决因数据类型不匹配(如字符串'2022'误用于整型year列)导致返回空结果的常见问题。
在使用pandas进行数据筛选时,df.loc[...] 是常用方式,但更简洁、高效的做法是直接使用布尔索引。你遇到的“返回空DataFrame”问题,绝大多数情况下源于数据类型不一致——尤其是 Year 列实际存储为整数(int64),而代码中却用字符串 '2022' 进行比较,导致逻辑判断恒为 False。
✅ 正确做法是:先确认列的数据类型,再匹配对应类型:
# 查看Year列的数据类型 print(df['Year'].dtype) # 常见输出:int64 或 object
-
若输出为 int64(推荐且常见),则必须使用整数字面量 2022:
result = df[(df['Item Code'].isin(['04901', '04940'])) & (df['Year'] == 2022)]
-
更推荐写法(避免括号嵌套过多,提升可读性):
立即学习“Python免费学习笔记(深入)”;
result = df[df['Item Code'].isin(['04901', '04940']) & df['Year'].eq(2022)]
⚠️ 注意事项:
- & 是位与运算符(非 and),必须配合括号使用,否则会报 ValueError: The truth value of a Series is ambiguous;
- isin() 支持列表、元组、数组等可迭代对象,自动处理缺失值(NaN 不会被匹配);
- 若 Year 列为字符串类型(如 '2022'),则需统一用字符串比较;但建议在数据加载阶段就转换为数值类型:
df['Year'] = pd.to_numeric(df['Year'], errors='coerce') # 安全转整型
? 小技巧:可链式组合多个条件,例如同时限定季度和状态:
df[
df['Item Code'].isin(['04901', '04940']) &
df['Year'].eq(2022) &
df['Quarter'].isin([1, 2]) &
df['Status'].eq('Active')
]总结:类型一致是布尔索引生效的前提。始终用 df.dtypes 检查关键列类型,并据此选择匹配值的类型(2022 vs '2022'),即可避免“看似正确却返回空”的陷阱。










