【问题标题】:Pandas create percentile field based on groupby with level 1Pandas 基于 1 级的 groupby 创建百分位字段
【发布时间】:2023-03-13 11:41:01
【问题描述】:

给定以下数据框:

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

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

ValueError: level > 0 only valid with MultiIndex

当我运行这个时:

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

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

提前致谢!

【问题讨论】:

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


    【解决方案1】:

    按第一列 ('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
    

    【讨论】:

      猜你喜欢
      • 2019-02-08
      • 2015-04-25
      • 2019-02-24
      • 2021-03-30
      • 1970-01-01
      • 2022-06-13
      • 2014-07-04
      相关资源
      最近更新 更多