使用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
相关产品推荐
相关产品推荐

