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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 01:30:50