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

如何按指定占比(75%/15%/10%)对Pandas DataFrame分组?

按累计占比分组的实现方法

要实现按累计占比分组(前75%、中间15%、最后10%),可以通过计算累计求和与累计占比,再结合pd.cut完成分组。以下是具体步骤:

步骤说明

  1. 确保数据按count降序排序:分组基于数值从高到低的累计占比,若输入数据未排序,需先执行排序操作。
  2. 计算累计求和与累计占比:通过累计求和得到当前行及之前所有行的总和,再除以总计数得到累计占比。
  3. 根据累计占比分组:使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 02:45:37