如何按指定占比(75%/15%/10%)对Pandas DataFrame分组?
按累计占比分组的实现方法
要实现按累计占比分组(前75%、中间15%、最后10%),可以通过计算累计求和与累计占比,再结合pd.cut完成分组。以下是具体步骤:
步骤说明
- 确保数据按
count降序排序:分组基于数值从高到低的累计占比,若输入数据未排序,需先执行排序操作。 - 计算累计求和与累计占比:通过累计求和得到当前行及之前所有行的总和,再除以总计数得到累计占比。
- 根据累计占比分组:使用
pd.cut对累计占比区间进行切割,分配对应的类别标签。
完整代码示例
import pandas as pd # 构造示例数据 data = {'count': [20, 20, 15, 10, 10, 8, 7, 5, 5]} df = pd.DataFrame(data, index=['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I']) # 1. 确保数据按count降序排序(若输入未排序,需执行此步骤) # df = df.sort_values('count', ascending=False) # 2. 计算总计数、累计求和、累计占比 total_count = df['count'].sum() df['cum_sum'] = df['count'].cumsum() df['cum_pct'] = df['cum_sum'] / total_count * 100 # 3. 按累计占比分组 df['Class'] = pd.cut( df['cum_pct'], bins=[0, 75, 90, 100], # 对应前75%、中间15%、最后10%的区间 labels=['Top1', 'Top2', 'Top3'], include_lowest=True # 包含0%的边界值 ) # 可选:移除中间计算列 df = df.drop(['cum_sum', 'cum_pct'], axis=1) print(df)
输出结果
count Class A 20 Top1 B 20 Top1 C 15 Top1 D 10 Top1 E 10 Top1 F 8 Top2 G 7 Top2 H 5 Top3 I 5 Top3
关键细节
- 排序必要性:如果原始数据未按
count降序排列,必须先执行排序,否则分组逻辑会出错。 - 区间设置:
bins=[0,75,90,100]对应累计占比≤75%(Top1)、75%<占比≤90%(Top2)、占比>90%(Top3),完全匹配需求。 include_lowest=True:确保累计占比为0%的行(如果存在)被正确归入第一个分组。
内容的提问来源于stack exchange,提问作者beginner
相关产品推荐
相关产品推荐

