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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 18:48:03