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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 04:39:21