isin()返回全False常见原因是列表含NaN、类型不一致或列中存在未处理空值;isin()性能通常优于query(),尤其在30万行数据时更显著。
用
筛选 DataFrame 时,为什么返回全 False?
常见原因是传入的外部列表含
、类型不一致(比如字符串混着整数),或 DataFrame 对应列有空值但没处理。Pandas 的
对
默认不匹配——哪怕你列表里写了
,它也认不出来,因为
。
实操建议:
立即学习
“
Python免费学习笔记(深入)
”;
先检查外部列表:用
看类型是否统一;
清理数据:对目标列用
,或提前填充/过滤;
别手动塞
到列表里试图匹配空值——
不支持;真要保留空行,得额外用
合并逻辑。
和
在筛选时性能差多少?
小数据量(isin() 更快,尤其当外部列表较短(query() 要解析字符串表达式、走 AST 执行路径,而
直接哈希查表。
实操建议:
立即学习
“
Python免费学习笔记(深入)
”;
优先用
,简洁且高效;
避免在
里拼接长列表,比如
—— 当
超过几千项,Python 字符串拼接和解析开销明显上升;
如果必须用
(比如多条件混合),确保
是变量引用(
),而非字面量列表,否则会触发重复编译。
筛选后发现结果比预期少——是不是
自动去重了?
不是。
本身不改变原始顺序,也不去重;但如果你用它做布尔索引后又调用了
,或者外部列表本身有重复值(不影响结果),就容易误判。
Python 3.14.3
微软官方的 Python 扩展,是 VS Code 安装量最高的扩展(209M+)。集成 IntelliSense(通过 Pylance)、调试(通过 Python Debugger)、代码检查、格式化、重构和单元测试等功能。支持 Jupyter Notebook、虚拟环境管理和多 Python 版本切换。
下载
更可能的原因是:
目标列存在隐藏空格或大小写差异(比如
vs
),用
预处理;
外部列表是
或从
来的,而原 DataFrame 列含不可哈希类型(如 list、dict),导致
报错或静默跳过——此时会抛出
;
DataFrame 使用了
类型,且外部列表中某些值不在 category 中,
会返回
(不是报错),需先用
扩展。
想同时按多个列匹配一个二维外部集合,还能用
吗?
不能直接用单个
。它只支持一维序列匹配。但可以组合实现:
比如外部集合是
:
,目标列是
和
:
注意点:
索引设置会拷贝数据,大表慎用;可改用
避免临时索引;
元组顺序必须和列顺序严格一致;
如果有列含
,
会把它们归为同一类,但
仍不匹配——此时需单独处理空值分支。
多列匹配真正麻烦的地方不在语法,而在缺失值和类型对齐——这两个问题一旦漏掉,结果偏差很难肉眼察觉。
isin()NaNisin()NaNfloat('nan')NaN != NaNprint([type(x) for x in your_list])df['col'].dropna().isin(your_list)np.nanisin()df['col'].isna()isin()query()isin()df[df['col'].isin(my_list)]query()df.query("col in @my_list")my_listquery()my_list@my_listisin()isin().drop_duplicates()'apple ''apple'df['col'].str.strip().str.lower().isin(...)setdict.keys()isin()TypeError: unhashable typeCategoricalisin()Falsedf['col'].cat.add_categories(new_values)isin()isin()list of tuples[('A', 1), ('B', 2)]col1col2mask = df.set_index(['col1', 'col2']).index.isin([('A', 1), ('B', 2)])
result = df[mask].reset_index(drop=True)pd.MultiIndex.from_arrays([df['col1'], df['col2']]).isin(...)NaNMultiIndexisin()