如何获取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




