pandas中groupby分组后如何对多列应用apply(list)聚合为列表
实现方案
你之前的代码是分组后仅选中了B列做列表聚合,要同时聚合B、C两列,直接调整分组后的列选择和聚合逻辑即可,以下是可直接复用的写法:
最简写法
直接对需要聚合的多列统一指定聚合函数为list,代码最短、执行效率最高:
df2 = df.groupby('A', as_index=False)[['B', 'C']].agg(list)
运行后输出和目标结构完全一致:
A B C 0 1 [a, b] [1, 2] 1 2 [c, d, e, f] [3, 4, 5, 6] 2 3 [g] [7]
参数说明:
[['B', 'C']]:选中需要做聚合的两列,替代你之前代码里单选['B']的逻辑as_index=False:让分组键A直接作为普通列输出,不需要额外调用reset_index()
灵活定制写法
如果后续不同列需要用不同的聚合规则,可以用apply返回Series的写法,扩展性更强:
df2 = df.groupby('A', as_index=False).apply( lambda g: pd.Series({ 'B': g['B'].tolist(), 'C': g['C'].tolist() }) ).reset_index(drop=True)
兼容提示:如果使用的是较旧版本的pandas,运行
agg(list)出现类型报错,可以把聚合函数替换为lambda x: x.tolist(),代码修改为:df2 = df.groupby('A', as_index=False)[['B', 'C']].agg(lambda x: x.tolist())
内容的提问来源于stack exchange,提问作者agf1997
相关产品推荐
相关产品推荐

