首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将分组百分位数添加到熊猫DataFrame中

将分组百分位数添加到熊猫DataFrame中
EN

Stack Overflow用户
提问于 2022-05-26 20:21:51
回答 3查看 59关注 0票数 0

我想计算出给定组中数据帧的每一行的百分位数。例如,考虑一下来自不同运动项目的运动员的数据集。

代码语言:javascript
复制
pd.DataFrame({"name": ["Joe", "Bob", "Susan", "Kate", "Sam", "Shawn"], 
          "sport": ["hockey", "hockey", "hockey", "baseball", "baseball", "baseball"],
         "points": [1,2,3,1,4,9]})

我想把每个运动员的得分活动和来自同一项运动的运动员进行比较。直接比较棒球和曲棍球运动员是不公平的,所以我想看看每一个曲棍球运动员与其他曲棍球运动员相比会跌到哪里。这是所需的输出。

代码语言:javascript
复制
pd.DataFrame({"name": ["Joe", "Bob", "Susan", "Kate", "Sam", "Shawn"], 
          "sport": ["hockey", "hockey", "hockey", "baseball", "baseball", "baseball"],
         "points": [1,2,3,1,4,9],
         "percentile": [0,.5,1,0,.5,1]})

我的真实数据集有数千组和数十万行。

EN

回答 3

Stack Overflow用户

发布于 2022-05-26 20:36:18

代码语言:javascript
复制
df['percentile'] = df.groupby(['sport'])['points'].rank(pct=True)
print(df)

输出:

代码语言:javascript
复制
    name     sport  points  percentile
0    Joe    hockey       1    0.333333
1    Bob    hockey       2    0.666667
2  Susan    hockey       3    1.000000
3   Kate  baseball       1    0.333333
4    Sam  baseball       4    0.666667
5  Shawn  baseball       9    1.000000
票数 2
EN

Stack Overflow用户

发布于 2022-05-26 20:36:33

据我所知,没有直接计算百分位数的方法。这个回答建议使用带pct=True排名方法返回百分位数,结合groupby,您可以得到:

代码语言:javascript
复制
df.groupby("sport")["points"].rank(pct=True)

结果是

代码语言:javascript
复制
0    0.333333
1    0.666667
2    1.000000
3    0.333333
4    0.666667
5    1.000000

若要将其指定为列,请执行以下操作:

代码语言:javascript
复制
df['percentile'] = df.groupby("sport")["points"].rank(pct=True)
票数 1
EN

Stack Overflow用户

发布于 2022-05-26 20:42:17

若要获得预期的输出,请使用groupby.rank并进行重新标度:

组号3:

代码语言:javascript
复制
df['percentile'] = (df.groupby('sport')['points']
                      .rank(pct=True).
                      .sub(1/3).mul(3/2)
                    )

通用:

代码语言:javascript
复制
df['percentile'] = (df.groupby('sport')['points']
                      .apply(lambda g: g.rank(pct=True)
                            .sub(1/len(g))
                            .mul(len(g)/(len(g)-1) if len(g)>1 else 0))
                     )

输出:

代码语言:javascript
复制
    name     sport  points  percentile
0    Joe    hockey       1         0.0
1    Bob    hockey       2         0.5
2  Susan    hockey       3         1.0
3   Kate  baseball       1         0.0
4    Sam  baseball       4         0.5
5  Shawn  baseball       9         1.0
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72397643

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档