DataFrame.sum()计算结果异常求助:已转int类型仍得错误值
首先,咱们先排查最容易踩的坑:astype('int')操作没有真正修改你的DataFrame。很多时候新手会写df.astype('int')但忘记把结果赋值回原变量,导致后续求和还是用的原来未转换的数据。比如:
# 错误:只是临时转换,没有保存结果 df.astype('int') # 正确:把转换后的结果赋值给df(或者新变量) df = df.astype('int')
接下来,咱们看看其他可能的原因:
数据中存在隐藏的空值(NaN):如果你的数据里有NaN,直接用
astype('int')会报错,这时候你可能用了astype('Int64')(pandas的可空整数类型)。这种类型求和时会把NaN当作0计算,而且结果会返回浮点数(比如3.0)。但你说CNBC的5个数值之和远超3,那可能是你以为的“数值”其实是空值?可以用df.isna().sum()检查每列的空值数量,确认后用df.fillna(0)填充再求和。类型转换不彻底:有些列可能因为存在非数字内容(比如字符串格式的'N/A'、空格等),导致
astype('int')转换失败(如果没加errors='ignore'会直接报错,加了的话这些列还是object类型)。你可以用print(df.dtypes)查看所有列的类型,确保需要求和的列都是int或Int64类型。求和的轴参数搞反了:默认
df.sum()是按列求和(axis=0),如果你需要的是行求和,得用df.sum(axis=1)。看看你要的结果是不是行求和的数值?布尔值被转换成整数:如果你的数据原本是布尔类型(True/False),转成int后True会变成1,False变成0。如果CNBC列里只有3个True,求和结果就是3.0,这可能和你以为的“数值”不符。检查一下原始数据是不是布尔值而非你预期的数字。
最后,给你个验证步骤:
- 打印
df.dtypes确认所有目标列都是整数类型; - 打印
df.head()看看CNBC列的实际数值是不是你以为的那些数; - 重新执行
df = df.astype('int')(或Int64)后再调用df.sum()。
内容的提问来源于stack exchange,提问作者Matthew Chung

