Pandas Groupby后列意外丢失:Balance Summary Info列消失原因及解决方法
问题解答
为什么Balance Summary Info列消失?
你用agg("sum")这种全局聚合方式时,Pandas会自动根据列的数据类型判断是否执行聚合:
- 数值型列(比如
Total Invoice Amount ($)、Revenue、EBITDA)能正常执行求和,所以会保留在结果里 Balance Summary Info大概率是字符串或文本类型,无法执行sum操作,因此被自动排除出结果集
如何保留该列?
不能再用全局的"sum"聚合,得给不同列指定对应的聚合规则,以下是几种实用方案:
方案1:保留每组的首个(或最后一个)值
如果同一客户组内的Balance Summary Info内容一致,直接取组内第一个或最后一个值即可:
mydf = mydf.groupby([Customer_ID, Customer_Name]).agg( { "Balance Summary Info": "first", # 换成"last"就是取组内最后一个值 "Total Invoice Amount ($)": "sum", "Revenue": "sum", "EBITDA": "sum" } ).reset_index()
方案2:合并同组内的所有文本内容
如果同一客户组内的Balance Summary Info有不同内容,想合并成一个字符串:
mydf = mydf.groupby([Customer_ID, Customer_Name]).agg( { "Balance Summary Info": lambda x: ", ".join(x.dropna()), # 先去掉空值再用逗号分隔合并 "Total Invoice Amount ($)": "sum", "Revenue": "sum", "EBITDA": "sum" } ).reset_index()
方案3:批量处理非数值列
如果有多个非数值列不想逐个指定,可以自动区分列类型批量设置规则:
# 筛选出数值列和非数值列 numeric_cols = mydf.select_dtypes(include=['number']).columns.tolist() non_numeric_cols = [col for col in mydf.columns if col not in numeric_cols + [Customer_ID, Customer_Name]] # 构建聚合规则字典 agg_dict = {col: "sum" for col in numeric_cols} agg_dict.update({col: "first" for col in non_numeric_cols}) # 执行分组聚合 mydf = mydf.groupby([Customer_ID, Customer_Name]).agg(agg_dict).reset_index()
内容的提问来源于stack exchange,提问作者hotmeatballsoup
相关产品推荐
相关产品推荐

