Pandas DataFrame.groupby.sum()聚合时丢失列如何解决
问题原因
使用groupby().sum()时,pandas默认仅对数值类型列执行求和聚合,Assignment、Order reason属于文本类型,无法参与求和运算,因此会被自动排除,不会出现在最终聚合结果中。
另外注意样例中的Amount字段带千分位逗号,pandas读入后会默认识别为文本类型,直接求和会出现字符串拼接的错误,需要先做类型转换。
解决方法
核心是通过agg()方法为每一列显式指定聚合规则,不要直接调用sum(),同时设置as_index=False避免分组字段被设为行索引,保留普通数据表结构。
场景1:同组下非数值列取值唯一/取首个非空值
大部分业务场景下同一个Reference对应的Assignment、Order reason是固定值,直接取分组内第一个非空值即可:
import pandas as pd wb = pd.read_excel("file.XLSX") # 先处理Amount列的格式,转成可计算的数值类型 wb["Amount"] = wb["Amount"].str.replace(",", "").astype(float) # 按Reference分组,为每列指定聚合规则 wb = wb.groupby("Reference", as_index=False).agg({ "Amount": "sum", "Assignment": "first", "Order reason": "first" })
场景2:同组下非数值列存在多个不同值,需保留全部信息
如果同一个Reference分组下对应多个Assignment或Order reason值,可以将同组去重后的值拼接为字符串保留:
wb = wb.groupby("Reference", as_index=False).agg({ "Amount": "sum", "Assignment": lambda x: "、".join(x.dropna().unique()), "Order reason": lambda x: "、".join(x.dropna().unique()) })
上述代码会自动跳过空值,把同组下的唯一值用顿号拼接,不会丢失信息。
内容的提问来源于stack exchange,提问作者259felix
相关产品推荐
相关产品推荐

