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

标签 python pandas dataframe pandas-groupby pandas-loc

我有一个像这样的数据框:

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/

相关文章:

python - 比较具有不同列名的两个 Pandas 数据框并找到匹配项

python - 如何在 Python 中生成 future 日期时间序列并从集合中确定最近的日期时间

python - 获取 python-markdown 扩展以在 Django 中输出具有特定类属性的 html 标签?

python - 将模块导入 Jupyter

python - DataFrame 到列表的列表而不更改值的数据类型

python - 识别树中的根 parent 及其所有 child

python - 根据每个值对列的值进行分组

python - 合并并完成两个 pandas 数据框的值

sql - 连接 Apache Spark DataFrame 中的列

Python DataFrame : Replace values using dictionary, 如果不在字典中则转换 NaN