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
相关产品推荐
相关产品推荐

