Pandas按weight_conversion分组求和sales_units结果异常解决方法
问题根因
你遇到的异常由两个问题共同导致:
- 列名拼写错误:你的代码中引用的列名是
Sales_Unit,但实际DataFrame中的列名为全小写下划线格式的sales_units,Pandas对列名是大小写、格式完全敏感的,拼写不匹配会直接触发列不存在的报错,不过这不是你看到长串乱码的核心原因。 - 核心问题:
sales_units列的实际数据类型为object(字符串类型),并非你预期的整型。当对字符串类型的列执行sum()聚合时,Pandas不会做数值加法运算,而是会将同组下的所有字符串直接首尾拼接,最终就生成了你看到的、由数字字符组成的无意义长串。
修复步骤
- 先执行以下代码确认列名和字段类型,验证上述判断:
输出中你会看到# 打印所有列名 print(df.columns.tolist()) # 打印每列的数据类型 print(df.dtypes)sales_units对应的dtype为object,而非数值类型的int64/float64。 - 将
sales_units列转换为数值类型,同时自动标记列中的非数字脏数据为缺失值:
转换完成后可以执行df['sales_units'] = pd.to_numeric(df['sales_units'], errors='coerce')print(df[df['sales_units'].isna()])查看存在脏数据的行,把混入的空格、特殊字符等异常值清理干净即可。 - 修正列名拼写,重新执行聚合逻辑,两种方法都可以得到正确结果:
- groupby 写法:
result = df.groupby('weight_conversion', as_index=False)['sales_units'].sum() - pivot_table 写法:
result = df.pivot_table( index='weight_conversion', values='sales_units', aggfunc='sum', as_index=False )
- groupby 写法:
注意事项
如果你的weight_conversion列是通过计算生成的浮点数,可能存在浮点精度问题(比如本该是0.1的值实际存储为0.1000000000001、0.0999999999999),导致本该分到同一组的数据被拆分。这种情况可以先根据业务需要的精度对该列做四舍五入后再分组,例如保留1位小数:
df['weight_conversion'] = df['weight_conversion'].round(1)
如果需要最终结果的sales_units为整型,确认列中无缺失值后执行类型转换即可:
result['sales_units'] = result['sales_units'].astype(int)
运行后得到的结果和你的预期完全一致:
weight_conversion sales_units 0 0.1 3 1 50.0 300 2 96.1 20 3 314.4 2 4 500.0 300
内容的提问来源于stack exchange,提问作者Ashima
相关产品推荐
相关产品推荐

