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

