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

使用np.cut按百分比分组且保留原count列的实现方法

解决方案

首先明确需求:按count列的累计总和占比将数据分为Top75(累计占比≤75%)、Top15(累计占比75%-90%)、Top10(累计占比90%-100%),同时保留原count列。

实现代码

import pandas as pd
import numpy as np

# 构造原始DataFrame
df = pd.DataFrame(
    {'count': [20, 20, 15, 10, 10, 8, 7, 5, 5]},
    index=['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I']
)

# 1. 按count降序排序,确保大值优先累计
df_sorted = df.sort_values('count', ascending=False)

# 2. 计算累计count及占总count的比例
total_count = df_sorted['count'].sum()
cumulative_ratio = df_sorted['count'].cumsum() / total_count

# 3. 用np.cut分箱,新增Class列(不会删除原count列)
df_sorted['Class'] = np.cut(
    cumulative_ratio,
    bins=[0, 0.75, 0.9, 1],  # 划分占比区间
    labels=['Top75', 'Top15', 'Top10'],  # 对应标签
    include_lowest=True  # 确保第一个区间包含起始点
)

# 4. 恢复原始索引顺序(可选,若不需要排序结果可省略)
df_result = df_sorted.loc[df.index]

print(df_result)

输出结果

count   Class
A     20  Top75
B     20  Top75
C     15  Top75
D     10  Top75
E     10  Top75
F      8  Top15
G      7  Top15
H      5  Top10
I      5  Top10

关键说明

  • 之前用np.cut丢失count列,是因为直接将分箱结果覆盖了原列,正确做法是新增Class列保留原数据。
  • 区别于np.qcut:qcut是按count值的分位数分组(每组数据量大致相等),而这里是按累计总和占比分组,必须先计算累计占比再用np.cut分箱。
  • 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 03:31:05