【问题标题】:Pandas: group by quantiles and calculate statsPandas:按分位数分组并计算统计数据
【发布时间】:2020-06-09 15:45:03
【问题描述】:

我有99个人的年收入数据:

import pandas, random
incomes = pandas.DataFrame({'income':[round(random.triangular(20,80,200),0) for i in range(99)]}) 

如何:

  • 将他们分成 3 个分位数,“穷人”、“中等”、“富人”,每人 33 人
  • 计算每个分位数的平均收入

抱歉,听起来像个新手问题。我在学。谢谢!

【问题讨论】:

  • 分位数可能不完全是 33/33/33,尤其是整数
  • 感谢@yatu!我支持你,但没有“接受”你的最终答案,因为我仍然认为 qcut() 不均匀地拆分集合,在 bin 边缘存在重复项

标签: python pandas grouping quantile


【解决方案1】:

如前所述,要对列进行分组,您可以使用Series.quantile,它允许指定分位数序列。然后使用pd.cut 将列拆分为 bin。

然后,您可以使用“分位数组”来获取对数据框进行分组的统计信息,如下所示:

quant = incomes.income.quantile(q=[0,0.33,0.66,1]).values
incomes['groups'] = pd.cut(incomes.income, quant, labels=["poor", "middle", "rich"])
incomes['avg_income'] = incomes.groupby('groups').transform('mean')

或者,正如@allolz 提到的,您可以使用qcut,它可以一步完成上述操作:

incomes['groups'] = pd.qcut(incomes.income, 3, labels=['poor', 'medium', 'rich'])

print(incomes)

    income  groups  avg_income
0     96.0  middle   89.312500
1     77.0    poor   53.531250
2     93.0  middle   89.312500
3     86.0  middle   89.312500
4     59.0    poor   53.531250
..     ...     ...         ...
94    29.0    poor   53.531250
95   121.0    rich  112.823529
96    87.0  middle   89.312500
97   111.0    rich  112.823529
98    55.0    poor   53.531250

【讨论】:

  • 感谢@yatu,我仍然遇到 qcut() 在存在重复项的情况下无法均匀拆分 bin 的问题。我能想到的唯一解决方法是添加一个具有唯一值的额外“rank”列,并将该“rank”列用于 qcut()。但我希望有一个更直接的解决方案...
猜你喜欢
  • 1970-01-01
  • 2020-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-11
  • 1970-01-01
  • 2021-12-16
相关资源
最近更新 更多