Pandas DataFrame如何删除值全为字符串'nan'的列和行
全字符串'nan'列/行删除方案
核心问题原因
- 执行
df = df.applymap(str)后,pandas原生缺失值NaN被转换为字符串类型的'nan',不属于dropna方法默认识别的空值范畴,因此原生删除空值的方法失效 - 原循环代码失效有两个原因:一是遍历过程中动态删除列会导致列的位置索引偏移,出现漏判;二是
drop方法的columns参数需要传入列名,原代码传入的是列的位置序号,参数不匹配导致删除操作未生效
推荐实现代码(向量化操作,效率更高)
删除所有值全为字符串'nan'的列
df = df.loc[:, ~(df == 'nan').all(axis=0)]
删除所有值全为字符串'nan'的行
df = df.loc[~(df == 'nan').all(axis=1), :]
如果你的数据中可能存在大小写不一致的'Nan'/'NAN'等情况,可以调整判断逻辑兼容:
# 大小写不敏感的判断,适配各种写法的nan字符串 df = df.loc[:, ~df.apply(lambda x: x.str.lower()).eq('nan').all(axis=0)] df = df.loc[~df.apply(lambda x: x.str.lower()).eq('nan').all(axis=1), :]
可运行的循环版实现(仅作逻辑参考,优先使用向量化方案)
提前将列名存入独立列表避免索引偏移,直接基于列名判断删除:
for col in df.columns.tolist(): if (df[col] == 'nan').all(): df.drop(columns=col, inplace=True)
内容的提问来源于stack exchange,提问作者xxgaryxx
相关产品推荐
相关产品推荐

