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

如何用df.groupby()按period和age分组计算binary_target=1的占比?

问题描述

我有一个提取自2017年11月至2023年1月的论坛帖子DataFrame,包含成员加入月份(period)、年龄(age)以及二分类变量(binary_target),数据示例如下:

periodbinary_targetage
2018-0402
2018-0402
2018-0414
2018-0400
.........
2022-08027
2022-08011
2022-0811

请问是否可以使用df.groupby()函数同时按period和age分组,计算每个period与age组合中binary_target=1的占比?理想情况下,将结果存储为如下格式的DataFrame:

period123456789...
2017-110.290.330.350.350.350.300.340.330.33...
2017-120.310.290.340.350.380.320.290.360.32...
2018-010.320.290.360.320.370.330.340.410.37...
.................................
解决方案

完全可以实现,步骤如下:

  1. 分组计算占比:通过groupby按period和age分组,对binary_target取均值——因为该变量是0/1二分类,均值恰好等于该组中binary_target=1的样本占比。
  2. 转换为宽表格式:用unstack()将age从行索引转换为列,得到你想要的结构。
  3. (可选)处理缺失值:如果某些period和age的组合没有数据,会出现缺失值,可以用fillna()填充(比如填充0或该period的整体均值)。

完整代码示例

# 计算每个period-age组合的binary_target=1占比
result = df.groupby(['period', 'age'])['binary_target'].mean()

# 转换为宽表,age作为列
result_wide = result.unstack(level='age')

# 可选:填充缺失值(这里用0填充,可根据需求调整)
result_wide = result_wide.fillna(0)

# 查看结果
print(result_wide)

代码说明

  • groupby(['period', 'age'])['binary_target'].mean():先按月份和年龄分组,然后计算每组中1的占比(均值)。
  • unstack(level='age'):把分组后的age索引展开成列,period作为行索引,正好匹配你想要的输出格式。
  • 如果需要保留所有可能的age值(比如从0到最大年龄),可以先对age做reindex,确保没有遗漏的年龄列。

内容的提问来源于stack exchange,提问作者Connor95

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 16:02:45