Python pandas将列值转为统计列并按双列分组计数求和的实现方法
问题原因
你原代码的问题在于:pd.crosstab生成的结果仅包含tar、date作为索引,以及stat不同值的计数列,不存在ppr字段,后续分组求和ppr的操作自然无法执行,同时也缺失了分组行数的统计逻辑。
实现方案
方案1:用pivot_table一步完成所有聚合
这是最简洁的实现方式,通过一次透视表操作同时完成计数、求和、列转置的需求:
import pandas as pd # 示例数据构造,你实际使用时可以跳过这步 data = { 'tar': ['aa','aa','aa','cc','cc'], 'date': ['q122','q122','q122','q222','q222'], 'ex': ['bb','bb','bb','zz','zz'], 'ppr': [10,15,10,20,15], 'stat': ['hi','hello','hi','hey','hello'] } df = pd.DataFrame(data) # 核心聚合逻辑 res = df.pivot_table( index=['tar', 'date'], columns='stat', aggfunc={ 'ppr': ['sum', 'count'], 'stat': 'count' }, fill_value=0 ).reset_index() # 调整列名和列顺序,匹配你要的输出格式 res.columns = ['tar', 'date', 'count', 'ppr_sum', 'hello', 'hey', 'hi'] res = res[['tar', 'date', 'count', 'ppr_sum', 'hi', 'hello', 'hey']]
输出结果和你要求的完全一致。
方案2:用crosstab + 分组聚合 + 合并的方式
如果你习惯用crosstab处理stat列转置,可以拆分步骤分别计算后合并:
# 计算stat各值的出现次数 stat_cnt = pd.crosstab( index=[df['tar'], df['date']], columns=df['stat'], fill_value=0 ).reset_index() # 计算分组的行数和ppr总和 base_agg = df.groupby(['tar', 'date'], as_index=False).agg( count=('ppr', 'count'), ppr_sum=('ppr', 'sum') ) # 合并两部分结果得到最终输出 res = base_agg.merge(stat_cnt, on=['tar', 'date'], how='left')
内容的提问来源于stack exchange,提问作者Lynn
相关产品推荐
相关产品推荐

