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

Python pandas读取Excel和CSV后groupby分组求和结果不同如何解决

问题根因与解决方法

两个DataFrame肉眼显示一致但分组结果不同,核心原因是底层数据存在不可见的差异,按以下步骤排查即可对齐结果:

步骤1:核对所有列的数据类型

不要仅看显示内容,先执行以下代码对比两个DataFrame的元数据:

# 输出两个DF的字段类型、非空值数量
FY20.info()
FY20b.info()

常见不一致场景:

  • 数字型分组键(比如Plant、纯数字SKU):Excel读取时自动识别为int/float类型,CSV读取时被识别为字符串类型,不同数据类型在groupby时会被判定为不同分组。
  • 求和列:CSV读取时因为存在特殊字符(如千分位逗号、空占位符)被识别为object类型,求和运算结果异常。
    解决方法:统一转为和Excel读取结果相同的类型,示例:
# 把CSV读取的Plant列转为int类型
FY20b['Plant'] = FY20b['Plant'].astype(int)
# 把求和列转为float类型
FY20b[["OrderQuantity","DeliveredQuantity"]] = FY20b[["OrderQuantity","DeliveredQuantity"]].astype(float)

步骤2:清理字符串分组键的不可见字符

字符串类型的分组键(如SKU、Material)可能存在首尾空格、制表符、换行符等不可见字符,Excel读取时会自动修剪这类字符,CSV读取时会默认保留,导致groupby分组错误。
统一清理所有字符串分组键:

group_cols = ['SKU', 'Material', 'Plant']
for col in group_cols:
    # 仅处理字符串类型列
    if FY20[col].dtype == object:
        FY20[col] = FY20[col].str.strip()
    if FY20b[col].dtype == object:
        FY20b[col] = FY20b[col].str.strip()

步骤3:对齐空值识别规则

CSV读取时默认会把空单元格识别为空字符串'',而Excel读取时会识别为NaN,空字符串和NaN在groupby时会被判定为不同分组。
在读取CSV时添加参数统一空值识别逻辑:

FY20b = pd.read_csv("Input Data\Historical Demand FY20.csv", na_values=[''])

步骤4:定位具体差异(可选)

如果以上操作后结果还是不一致,执行以下代码直接输出两个原始DataFrame的具体差异点:

# 先判断是否完全相等
print(FY20.equals(FY20b))
# 输出不一致的具体位置
pd.testing.assert_frame_equal(FY20, FY20b)

内容的提问来源于stack exchange,提问作者fantje1996

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 06:27:01