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

Python Pandas如何获取累计占比达指定百分比的类别?

解决方案

Pandas没有直接一步到位的内置函数,但可以用cumsum()结合布尔索引快速实现需求,完全不需要手动编写for循环。

具体步骤示例

假设你已经有了降序排列的value_counts()结果(注:你描述的“升序”应该是笔误,因为要优先取占比大的类别,实际需用降序):

import pandas as pd

# 模拟你的原始数据
data = pd.Series(['A']*20 + ['B']*15 + ['C']*15 + ['D']*10 + ['E']*10 + ['F']*10 + ['G']*8 + ['H']*5 + ['I']*5)
counts = data.value_counts(ascending=False)  # 降序排列,确保占比高的类别在前

# 计算每个类别累计占比
total = counts.sum()
cumulative_pct = counts.cumsum() / total

# 设置目标阈值
threshold = 0.7

# 筛选累计占比首次达到/超过70%的所有前置类别
first_above_threshold = (cumulative_pct >= threshold).idxmax()
selected_categories = counts.index[:counts.index.get_loc(first_above_threshold) + 1]

# 输出结果
print(selected_categories)

运行后会输出符合你需求的结果:

Index(['A', 'B', 'C', 'D', 'E'], dtype='object')

关于“占比覆盖最大类别的快捷方法”

  • 如果是取占比最高的前N个类别,直接用value_counts()搭配head()即可:
    # 取占比最高的前3个类别
    top_3_cats = counts.head(3)
    
  • 如果是找覆盖指定占比的最少类别,就是上面的累计占比筛选逻辑,这是帕累托分析(二八法则)的典型应用,cumsum()是最简洁的实现方式。

补充说明

  • 若你拿到的value_counts()确实是升序,先转成降序:counts = counts.sort_values(ascending=False)
  • groupby()在这里无效是因为你不需要分组聚合,而是要对计数结果做累计计算,二者场景不匹配。

内容的提问来源于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 00:10:14