Pandas删除DataFrame中求和为0的列代码失效问题解决
问题根源
你的代码删不掉列,基本是下面几个原因导致的:
- 列的数据类型不对:合并多个Excel时很容易把数值列读成字符串类型,字符串列做
sum()得到的是字符串拼接结果,和数值0做==判断永远不成立;部分列存在非数值的脏数据也会导致求和结果不符合预期。 - 空值影响:如果某列全是空值
NaN,pandas默认sum()返回的是NaN,NaN == 0的结果是False,不会进入删除分支。 - 浮点精度误差:浮点型数值列就算肉眼看求和是0,实际存储可能是
1e-15这类极小值,直接和0做等值判断会判定为不相等。 - 额外说明:循环遍历columns逐列drop的写法效率很低,列数多的时候跑起来很慢,而且如果遍历的是初始状态的列索引,遇到已经删掉的列还会抛错。
正确写法
直接用pandas向量化操作一次性筛选,避开所有上面的坑:
import pandas as pd # 第一步:所有列强制转数值,非法值/非数值转空值 # 第二步:按列求和,用绝对值阈值判断兼容浮点误差,全空列sum为NaN会自动判定为需要删除 df_Final_hours = df_Final_hours.apply(pd.to_numeric, errors='coerce').loc[:, lambda d: d.sum().abs() > 1e-8]
如果提前确认过所有列都是数值类型、没有字符串脏数据,可以简化成:
df_Final_hours = df_Final_hours.loc[:, df_Final_hours.sum().abs() > 1e-8]
提前校验避免误删
执行删除前可以先打印所有待删除的列名,核对是否符合预期:
zero_cols = df_Final_hours.apply(pd.to_numeric, errors='coerce').sum()[lambda s: s.abs() <= 1e-8].index.tolist() print("求和为0、待删除的列:", zero_cols)
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

