pandas 获取另一列中每个唯一值的前2个值

i7uaboj4  于 2023-02-02  发布在  其他
关注(0)|答案(3)|浏览(149)

我有一个这样的DataFrame:

student       marks     term
steve         55        1
jordan        66        2
steve         53        1
alan          74        2
jordan        99        1
steve         81        2
alan          78        1
alan          76        2
jordan        48        1

我想返回每个学生最高的两个分数

student  marks    term
steve      81     2
steve      55     1
jordan     99     1
jordan     66     2
alan       78     1
alan       76     2

我试过了

df = df.groupby('student')['marks'].max()

但它返回1行,我希望每个学生在他们提到的顺序与前两名的分数。

vsmadaxz

vsmadaxz1#

您可以使用groupby + nlargest来查找2个最大值;然后使用loc按照它们在df中出现的顺序进行排序:

out = (df.groupby('student')['marks'].nlargest(2)
       .droplevel(1)
       .loc[df['student'].drop_duplicates()]
       .reset_index())

输出:

student  marks
0   steve     81
1   steve     55
2  jordan     99
3  jordan     66
4    alan     78
5    alan     76

如果你也想保留"terms",你可以使用索引:

idx = df.groupby('student')['marks'].nlargest(2).index.get_level_values(1)
out = df.loc[idx].set_index('student').loc[df['student'].drop_duplicates()].reset_index()

输出:

student  marks  term
0   steve     81     2
1   steve     55     1
2  jordan     99     1
3  jordan     66     2
4    alan     78     1
5    alan     76     2

@sammywemmy建议了一个更好的方法来推导第二个结果:

out = (df.loc[df.groupby('student', sort=False)['marks'].nlargest(2)
              .index.get_level_values(1)]
       .reset_index(drop=True))
qvtsj1bj

qvtsj1bj2#

您应该使用:

df = df.groupby(['student', 'term'])['marks'].max()

(with可选的.reset_index()

ubof19bj

ubof19bj3#

在分组之前进行排序就足够了,因为您需要保留term列:

df.sort_values('marks').groupby('student', sort = False).tail(2)
  student  marks  term
0   steve     55     1
1  jordan     66     2
7    alan     76     2
6    alan     78     1
5   steve     81     2
4  jordan     99     1

相关问题