如何在Pandas中分组求和后排序并计算累积占比达标ID的占比
实现需求的最优方法
咱们从已经得到的df_1出发,一步步完成你要的两个需求:
步骤1:按year_month分组,每组内pct降序排序
直接用sort_values就能轻松搞定,指定先按year_month升序、再按pct降序排列,这样每个月份内的记录就会按占比从高到低排好:
# 按月份分组后对pct降序排序 df_sorted = df_1.sort_values(['year_month', 'pct'], ascending=[True, False])
步骤2:计算每个月内累积pct≤80的id占比
这一步咱们用链式操作来简化代码,效率也更高:
result = (df_sorted # 按月份分组,给每个组添加累积占比列 .groupby('year_month') .apply(lambda x: x.assign(cum_pct=x['pct'].cumsum())) .reset_index(drop=True) # 按月份分组,统计符合条件的id数和当月总id数 .groupby('year_month') .agg( valid_count=('id', lambda x: x[x['cum_pct'] <= 80].count()), total_count=('id', 'count') ) # 计算占比并转成百分比格式 .assign(pct=lambda x: (x['valid_count'] / x['total_count']).mul(100).astype(str) + '%') # 转成你要的横向结果格式 ['pct'] .to_frame() .T )
运行后result就会输出你期望的格式:
201903 201904 pct 25% 50%
代码小说明
- 排序后用
groupby.apply给每个月份组生成累积占比列cum_pct; - 再次按月份分组,分别统计符合条件的id数量和当月总id数;
- 计算占比后转成带百分号的字符串,最后转置成横向展示的结果。
这种链式操作既清晰又高效,避免了过多中间变量,也充分利用了Pandas的向量化运算特性。
内容的提问来源于stack exchange,提问作者daiyue
相关产品推荐
相关产品推荐

