我有一个像这样的数据框:
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 行,我希望每个学生按照提到的顺序获得前两名分数。
最佳答案
您可以使用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
如果您还想保留“术语”,您可以使用索引:
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))
关于python - 获取另一列中每个唯一值的前 2 个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71417257/