You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何获取Pandas列的特定分位数区间并完成分组统计?

嘿,这个需求我之前刚好处理过,其实核心就是先把分位数的边界搞清楚,然后用Pandas的分组工具就能轻松统计你要的指标,我给你一步步拆解:

第一步:明确分位数的对应边界

先把你要的5个区间对应的百分位数理清楚(加起来刚好100%):

  • 前1%:收入 ≥ 99分位数(最高的1%人群)
  • 次4%:95分位数 ≤ 收入 < 99分位数(99%-95%=4%,刚好是第二梯队)
  • 次15%:80分位数 ≤ 收入 < 95分位数(95%-80%=15%)
  • 次20%:60分位数 ≤ 收入 < 80分位数(80%-60%=20%)
  • 最后50%:收入 < 60分位数(剩下的50%人群)

numpy.percentile算出这些边界值就行:

import numpy as np
import pandas as pd

# 假设你的数据集是df,收入列名为income
# 计算60、80、95、99这四个关键分位数
percentile_bounds = np.percentile(df['income'], [60, 80, 95, 99])
第二步:给收入数据打分组标签

pd.cut把每个居民的收入分配到对应的区间里,注意要处理好边界的包含关系:

# 构建完整的区间边界:从负无穷到各分位数,再到正无穷
bins = [-np.inf] + list(percentile_bounds) + [np.inf]
# 对应每个区间的标签,顺序要和bins匹配
group_labels = ['最后50%', '次20%', '次15%', '次4%', '前1%']

# 给DataFrame新增分组列,include_lowest=True确保最小收入能被包含在第一个区间
df['income_group'] = pd.cut(
    df['income'],
    bins=bins,
    labels=group_labels,
    include_lowest=True
)
第三步:统计你需要的核心指标

groupby配合agg就能一次性算出居民数量、收入均值、收入总和:

# 分组统计
stats_result = df.groupby('income_group').agg(
    居民数量=('income', 'count'),
    收入均值=('income', lambda x: round(x.mean(), 2)),  # 保留两位小数更直观
    收入总和=('income', 'sum')
).reset_index()

# 可以按收入从高到低排序,结果更清晰
stats_result = stats_result.sort_values('income_group', ascending=False)
print(stats_result)
小提醒
  • 如果你的收入数据有大量重复值,pd.cut的分组比例可能会和预期有微小偏差,这时候可以考虑先对数据去重后计算分位数,或者用pd.qcut(但qcut是严格按数量分位,可能会打破你要的精确比例,所以优先用cut+手动分位数)。
  • 如果你担心分位数的计算方式,可以给np.percentile加个method参数,比如method='midpoint'来调整分位数的计算逻辑,适配你的数据特性。

内容的提问来源于stack exchange,提问作者Er1Hall

火山引擎 最新活动