python-3.x - Pandas 基于 groupby 创建百分位字段,级别为 1

标签 python-3.x pandas multi-index percentile

给定以下数据框:

import pandas as pd    
df = pd.DataFrame({
    ('Group', 'group'): ['a','a','a','b','b','b'],
    ('sum', 'sum'): [234, 234,544,7,332,766]
    })

我想创建一个新字段,用于计算“group”中每个组的“sum”每个值的百分位数。问题是,我有 2 个标题列,无法弄清楚如何避免出现错误:

ValueError: level > 0 only valid with MultiIndex

当我运行这个时:

df=df.groupby('Group',level=1).sum.rank(pct=True, ascending=False)

我需要将 header 保持在相同的结构中。

提前致谢!

最佳答案

按第一列 ('Group', 'group') 进行分组,并计算 ('sum', 'sum') 列的排名使用:

In [106]: df['rank'] = (df[('sum', 'sum')].groupby(df[('Group', 'group')]).rank(pct=True, ascending=False))

In [107]: df
Out[107]: 
  Group  sum      rank
  group  sum          
0     a  234  0.833333
1     a  234  0.833333
2     a  544  0.333333
3     b    7  1.000000
4     b  332  0.666667
5     b  766  0.333333

请注意,.rank(pct=True) 计算的是百分比排名,而不是百分位。要计算百分位,您可以使用 scipy.stats.percentileofscore .

import scipy.stats as stats
df['percentile'] = (df[('sum', 'sum')].groupby(df[('Group', 'group')])
    .apply(lambda ser: 100-pd.Series([stats.percentileofscore(ser, x, kind='rank') 
           for x in ser], index=ser.index)))

产量

  Group  sum      rank percentile
  group  sum                     
0     a  234  0.833333  50.000000
1     a  234  0.833333  50.000000
2     a  544  0.333333   0.000000
3     b    7  1.000000  66.666667
4     b  332  0.666667  33.333333
5     b  766  0.333333   0.000000

关于python-3.x - Pandas 基于 groupby 创建百分位字段,级别为 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37093088/

相关文章:

python - 如何根据日期有条件地设置数据框的值

Python Pandas 计算出现的间隔

c++ - 使用 Boost Multi-Index 搜索多个索引

python - 填补 MultiIndex Pandas Dataframe 中的日期空白

python - 使用多索引的新列将 pandas 数据框按列表分解为多行

python - 为什么 Stackdriver 日志中会间歇性地出现空行?

python - 如何对字典进行子类化,使其支持通用类型提示?

python - 如何使用 VLOOKUP 类型在 Pandas 中的新列中添加值?

Python selenium - 与主机、端口、用户名、密码的代理连接

python - pandas.concat 仅使用一张表中的索引