如何用Pandas快速生成数据占比分布汇总?含场景示例
问题解答
一、按占比分组的实现方法
没有专门的Pandas函数可以一键完成这种自定义占比分组,但通过cumsum()计算累计占比,再结合pd.cut()划分区间,就能快速实现需求,步骤如下:
假设你的数据是通过df.value_counts()得到的结果,先将其赋值给变量counts:
import pandas as pd # 模拟你的数据(对应value_counts结果) counts = pd.Series([20,20,15,10,10,8,7,5,5], index=['A','B','C','D','E','F','G','H','I']) # 1. 计算单个类别占比和累计占比 counts = counts.reset_index().rename(columns={'index':'category', 0:'count'}) # 将索引转为列 counts['proportion'] = counts['count'] / counts['count'].sum() counts['cum_proportion'] = counts['proportion'].cumsum() # 2. 按自定义占比区间分组 counts['group'] = pd.cut( counts['cum_proportion'], bins=[0, 0.75, 0.9, 1.0], labels=['Top 75%', 'Middle 15%', 'Bottom 10%'], include_lowest=True # 确保第一个区间包含起始值 ) # 3. 提取各分组的类别 top_group = counts[counts['group'] == 'Top 75%']['category'].tolist() middle_group = counts[counts['group'] == 'Middle 15%']['category'].tolist() bottom_group = counts[counts['group'] == 'Bottom 10%']['category'].tolist()
运行后得到的分组结果完全符合你的需求:
- Top 75%: ['A', 'B', 'C', 'D', 'E']
- Middle 15%: ['F', 'G']
- Bottom 10%: ['H', 'I']
二、关于value_counts的索引是否需要转列
不是必须,但建议转列:
value_counts()返回的是带索引的Series,直接操作索引也能完成计算,但用reset_index()将索引转为普通列后,后续的占比计算、分组筛选等操作会更直观,代码可读性更高,也方便和其他DataFrame进行合并等操作。
内容的提问来源于stack exchange,提问作者beginner
相关产品推荐
相关产品推荐

