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

Pandas分组聚合问题求助:如何合并同一客户的购买项为单个字符串

解决Pandas分组后合并列并保留单行汇总的问题

我明白你的困扰了!你之前用transform的问题在于,它的设计目标是将聚合结果映射回原DataFrame的每一行,所以才会出现每个组的所有行都重复显示合并内容的情况。而你需要的是每个客户只保留一行的聚合汇总结果,这时候应该用agg()(聚合)方法而不是transform()。

正确的解决方案

这里有两种简洁的实现方式,都能得到你想要的结果:

方法一:同时按id_client和name_client分组

因为每个id_client对应的name_client是唯一的,我们可以同时把这两个列作为分组键,然后对purchases列执行合并操作:

import pandas as pd

df = pd.DataFrame({'id_client':[26,26,26,45,45,45,78,78], 'name_client':['John','John','John','Michael','Michael','Michael','Charlie','Charlie'], 'purchases':['Alpha','Beta','Omega','Alpha','Beta','Omega','Alpha','Beta']})

# 分组并聚合,同时重置索引避免多级索引
result = df.groupby(['id_client', 'name_client'], as_index=False)['purchases'].agg(', '.join)
# 重命名列名到你想要的"options"
result = result.rename(columns={'purchases': 'options'})

print(result)

方法二:仅按id_client分组,指定各列的聚合逻辑

如果你不想同时分组两个列,也可以只按id_client分组,然后分别指定name_client取第一个值(因为同组内都是相同的),purchases执行合并:

result = df.groupby('id_client', as_index=False).agg(
    name_client=('name_client', 'first'),
    options=('purchases', ', '.join)
)

print(result)

输出结果

两种方法都会得到你期望的结果:

id_client name_client          options
0         26        John  Alpha, Beta, Omega
1         45      Michael  Alpha, Beta, Omega
2         78      Charlie        Alpha, Beta

为什么之前的transform不行?

再简单解释下:transform()会确保返回的结果和原DataFrame的行数一致,它会把每个组的聚合结果重复填充到该组的每一行中。而agg()是直接对每个组执行聚合计算,返回的结果行数等于分组的数量,这正是你需要的单行汇总效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 23:27:38