如何用df.groupby()按period和age分组计算binary_target=1的占比?
问题描述
我有一个提取自2017年11月至2023年1月的论坛帖子DataFrame,包含成员加入月份(period)、年龄(age)以及二分类变量(binary_target),数据示例如下:
| period | binary_target | age |
|---|---|---|
| 2018-04 | 0 | 2 |
| 2018-04 | 0 | 2 |
| 2018-04 | 1 | 4 |
| 2018-04 | 0 | 0 |
| ... | ... | ... |
| 2022-08 | 0 | 27 |
| 2022-08 | 0 | 11 |
| 2022-08 | 1 | 1 |
请问是否可以使用df.groupby()函数同时按period和age分组,计算每个period与age组合中binary_target=1的占比?理想情况下,将结果存储为如下格式的DataFrame:
| period | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ... |
|---|---|---|---|---|---|---|---|---|---|---|
| 2017-11 | 0.29 | 0.33 | 0.35 | 0.35 | 0.35 | 0.30 | 0.34 | 0.33 | 0.33 | ... |
| 2017-12 | 0.31 | 0.29 | 0.34 | 0.35 | 0.38 | 0.32 | 0.29 | 0.36 | 0.32 | ... |
| 2018-01 | 0.32 | 0.29 | 0.36 | 0.32 | 0.37 | 0.33 | 0.34 | 0.41 | 0.37 | ... |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
解决方案
完全可以实现,步骤如下:
- 分组计算占比:通过
groupby按period和age分组,对binary_target取均值——因为该变量是0/1二分类,均值恰好等于该组中binary_target=1的样本占比。 - 转换为宽表格式:用
unstack()将age从行索引转换为列,得到你想要的结构。 - (可选)处理缺失值:如果某些
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
相关产品推荐
相关产品推荐

