Pandas GroupBy分组后如何为DataFrame新增聚合计算列
Pandas 分组新增聚合列实现方案
失败原因
原代码赋值失败核心有3个问题:
groupby直接聚合的结果以分组字段key为索引,和原DataFrame的逐行索引不匹配,直接赋值会出现索引对齐错误,生成大量空值- 聚合后调用
reset_index()会返回行数等于分组数的新DataFrame,和原表行数不一致,直接赋值会触发长度不匹配报错 - 代码中部分位置字段名写为
cfop,和需求指定的统计字段cfop_code不一致,会触发字段不存在错误
正确代码
使用groupby.transform实现,该方法会自动把聚合结果按原表行索引映射回每一行,无需额外对齐、合并操作:
import pandas as pd # 存储每个分组下cfop_code的去重值列表 df['unique_list'] = df.groupby('key')['cfop_code'].transform(lambda x: x.unique().tolist()) # 统计每个分组下cfop_code的去重值数量 df['unique_count'] = df.groupby('key')['cfop_code'].transform('nunique') # 统计每个分组下cfop_code的总记录数(非去重计数) df['not_unique_count'] = df.groupby('key')['cfop_code'].transform('size')
可选调整
- 如果需要
unique_list存储集合类型而非列表,把代码里的.tolist()替换为set(x)即可 - 如果不需要在原明细表保留聚合结果,只需要分组维度的统计结果,可以直接用agg一次性生成三个字段,对应代码如下:
grouped_stat = df.groupby('key').agg( unique_list=('cfop_code', lambda x: x.unique().tolist()), unique_count=('cfop_code', 'nunique'), not_unique_count=('cfop_code', 'size') ).reset_index()
内容的提问来源于stack exchange,提问作者Andre Nevares
相关产品推荐
相关产品推荐

