You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

pandas如何删除任意列包含'?'的DataFrame行数据

问题原因

你编写的循环过滤逻辑存在两个问题,会导致过滤结果不符合预期:

  • 遍历到非字符串类型的列时,数值和字符串'?'做相等判断会出现匹配异常,漏过包含?的行
  • 循环过程中反复对df赋值重置,遇到值带前后空格、空值等边界场景时很容易出现过滤遗漏
    同时逐列循环的写法效率极低,不符合pandas向量化操作的设计思路,不推荐使用。
正确实现方案

方法1:精确匹配?(性能最优,优先推荐)

直接对全表做值判断,只要任意列存在值为'?'的单元格就删除对应行,完全匹配你的需求:

# 筛选出所有列都不包含?的记录
df = df[~(df == '?').any(axis=1)]

代码逻辑说明:

  • df == '?':生成和原表结构完全一致的布尔矩阵,标记所有值为?的单元格
  • .any(axis=1):按行做判断,只要该行存在任意一个被标记为?的单元格,就返回True
  • ~:对布尔结果取反,最终保留所有不含?的行

方法2:高鲁棒性写法(适配CSV读取场景)

如果CSV文件中?是作为缺失值标记,存在前后带空格、格式不统一的情况,可以先把所有符合?规则的值替换为标准缺失值NaN,再直接删除包含缺失值的行:

import numpy as np
# 正则匹配所有前后带任意空白的?,替换为NaN后删除含缺失值的行
df = df.replace(r'^\s*\?\s*$', np.nan, regex=True).dropna(how='any')

运行上述任意一段代码,都可以正确删除所有任意列包含?的记录,你提到的索引为1和3的行会被准确移除。

内容的提问来源于stack exchange,提问作者wiryadev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 07:09:17