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
相关产品推荐
相关产品推荐

