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

如何在Pandas中按Position分组计算留存百分比(Retained/Enrolled)

正确实现方法

首先构造测试数据(若你的DataFrame已存在可跳过此步骤):

import pandas as pd

data = {
    'Position': ['FT', 'PT', 'S', 'FT', 'S', 'PT'],
    'Enrolled': [1, 1, 1, 1, 1, 1],
    'Retained': [1, 0, 1, 0, 0, 1]
}
df2 = pd.DataFrame(data)

方法一:用groupby+apply直接计算分组留存率

# 按Position分组,计算每个组的留存率
retention = df2.groupby('Position').apply(lambda group: group['Retained'].sum() / group['Enrolled'].sum())

# 按需求格式输出
for position, rate in retention.items():
    print(f"{position}  {rate:.2f}")

方法二:先分组求和再计算比率

这种方式更直观,能同时查看每个组的Enrolled和Retained总和:

# 分组统计Enrolled与Retained的总和
grouped_sum = df2.groupby('Position')[['Enrolled', 'Retained']].sum()

# 计算留存率
grouped_sum['Retention'] = grouped_sum['Retained'] / grouped_sum['Enrolled']

# 按格式输出
for position, row in grouped_sum.iterrows():
    print(f"{position}  {row['Retention']:.2f}")

你的代码问题说明

你之前的代码存在两处问题:

  1. 语法错误:groupby(by=['Position']).()不符合Python语法规范,groupby后需调用apply、agg等具体方法来执行分组操作。
  2. 逻辑错误:df2['Enrolled'].sum()/df2['Retained'].sum()计算的是整个数据集的总和比率,并非每个分组的比率,完全偏离了分组计算的需求。

两种方法的输出结果均符合你的期望:

FT  0.50
PT  0.50
S   0.50

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 20:05:25