首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对每个组的n个最大值行进行筛选

对每个组的n个最大值行进行筛选
EN

Stack Overflow用户
提问于 2020-06-02 17:14:20
回答 4查看 1.1K关注 0票数 3

上下文

我希望,对于每支球队,列的数据框架,其中包含前三名得分球员。

在我看来,这是Dataframe.nlargest()Dataframe.groupby()的结合,但我不认为这是支持的。我的理想解决办法是:

  • 直接在df上执行,而不必创建其他的df
  • 相对性能(实际df形状为7M行和5 col)

输入

代码语言:javascript
复制
import pandas as pd
df = pd.read_json('{"team":{"0":"A","1":"A","2":"A","3":"A","4":"A","5":"B","6":"B","7":"B","8":"B","9":"B","10":"C","11":"C","12":"C","13":"C","14":"C"},"player":{"0":"Alice","1":"Becky","2":"Carmen","3":"Donna","4":"Elizabeth","5":"Fran","6":"Greta","7":"Heather","8":"Iris","9":"Jackie","10":"Kelly","11":"Lucy","12":"Molly","13":"Nina","14":"Ophelia"},"points":{"0":15,"1":11,"2":13,"3":8,"4":10,"5":28,"6":29,"7":18,"8":25,"9":9,"10":12,"11":23,"12":18,"13":10,"14":15}}')
代码语言:javascript
复制
| team | player    | points |
|------|-----------|--------|
| A    | Alice     | 15     |
| A    | Becky     | 11     |
| A    | Carmen    | 13     |
| A    | Donna     | 8      |
| A    | Elizabeth | 10     |
| B    | Fran      | 28     |
| B    | Greta     | 29     |
| B    | Heather   | 18     |
| B    | Iris      | 25     |
| B    | Jackie    | 9      |
| C    | Kelly     | 12     |
| C    | Lucy      | 23     |
| C    | Molly     | 18     |
| C    | Nina      | 10     |
| C    | Ophelia   | 15     |

期望输出

代码语言:javascript
复制
df_output = pd.read_json('{"team":{"0":"A","1":"A","2":"A","3":"B","4":"B","5":"B","6":"C","7":"C","8":"C"},"player":{"0":"Alice","1":"Becky","2":"Carmen","3":"Fran","4":"Greta","5":"Iris","6":"Lucy","7":"Molly","8":"Ophelia"},"points":{"0":15,"1":11,"2":13,"3":28,"4":29,"5":25,"6":23,"7":18,"8":15}}')
df_output
代码语言:javascript
复制
| team | player  | points |
|------|---------|--------|
| A    | Alice   | 15     |
| A    | Becky   | 11     |
| A    | Carmen  | 13     |
| B    | Fran    | 28     |
| B    | Greta   | 29     |
| B    | Iris    | 25     |
| C    | Lucy    | 23     |
| C    | Molly   | 18     |
| C    | Ophelia | 15     |
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-06-02 17:23:10

您可以使用方法:

代码语言:javascript
复制
In [1401]: df[df.groupby('team')['points'].rank(ascending=False) <= 3]
Out[1401]: 
   team   player  points
0     A    Alice      15
1     A    Becky      11
2     A   Carmen      13
5     B     Fran      28
6     B    Greta      29
8     B     Iris      25
11    C     Lucy      23
12    C    Molly      18
14    C  Ophelia      15
票数 4
EN

Stack Overflow用户

发布于 2020-06-02 17:26:31

您可以将df.groupbydf.nlargest结合使用

代码语言:javascript
复制
df.groupby('team').apply(lambda x:x.nlargest(3,'points')).reset_index(drop=True)

  team   player  points
0    A    Alice      15
1    A   Carmen      13
2    A    Becky      11
3    B    Greta      29
4    B     Fran      28
5    B     Iris      25
6    C     Lucy      23
7    C    Molly      18
8    C  Ophelia      15
票数 3
EN

Stack Overflow用户

发布于 2020-06-02 17:30:29

像这样的东西可能管用-

代码语言:javascript
复制
df.loc[df.groupby(['team'])['points'].nlargest(3).reset_index().drop(['team','points'], axis=1)['level_1'].values]
   team   player  points
0     A    Alice      15
2     A   Carmen      13
1     A    Becky      11
6     B    Greta      29
5     B     Fran      28
8     B     Iris      25
11    C     Lucy      23
12    C    Molly      18
14    C  Ophelia      15
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62157558

复制
相关文章

相似问题

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