如何在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}")
你的代码问题说明
你之前的代码存在两处问题:
- 语法错误:
groupby(by=['Position']).()不符合Python语法规范,groupby后需调用apply、agg等具体方法来执行分组操作。 - 逻辑错误:
df2['Enrolled'].sum()/df2['Retained'].sum()计算的是整个数据集的总和比率,并非每个分组的比率,完全偏离了分组计算的需求。
两种方法的输出结果均符合你的期望:
FT 0.50 PT 0.50 S 0.50
内容的提问来源于stack exchange,提问作者M J
相关产品推荐
相关产品推荐

