在另一列中获取最大值行以获得唯一值:python

时间:2020-10-26 16:26:03

标签: python pandas

我正在尝试从“初始数据框”中看到的视图中过滤以下数据框至“所需输出”中显示的内容

初始数据框

name          group     subject  score   class_size
                                 
Steve       classrm_A   maths    98.22      20
John        classrm_A   maths    76.87      30
Mary        classrm_C   science  77.25      26
Steve       classrm_B   science  65.28      32
Mary        classrm_A   english  86.01      16
John        classrm_F   science  96.55      25

返回行以获取唯一的“名称”值,其中“分数”最大且“ class_size”等于或大于25。

所需的输出:

name          group     subject  score   class_size
                                 
Steve       classrm_B   science  65.28      32
Mary        classrm_C   science  77.25      26
John        classrm_F   science  96.55      25

这是我到目前为止尝试过的.....

min_class = df["class_size"] >= 25


df = df["min_class "]


df = df.groupby(['name']).max('score')

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

这将为您解决问题。我感觉这与您尝试过的方法略有不同,但我敢说它更“ Pythonish”。

res = df.loc[df['class_size'].ge(25)].copy()
res['rank'] = res.groupby('name')['score'].rank(ascending=False)
res = res.loc[res['rank'].eq(1)].drop('rank', axis=1)

此处的关键是带有.rank()的{​​{1}}函数-.groupby()本质上将以降序返回排名,.rank(ascending=False)将使您分别对每个组进行排名。

答案 1 :(得分:1)

在数据框中仅保留类大小大于25的行, 然后按分数对数据框进行排序, 然后删除“名称”列的所有重复项,并在重复的情况下仅保留第一行。

df = df[df["class_size"] >= 25]
df = df.sort_values("score", ascending=False)
df = df.drop_duplicates(subset=["name"], keep="first")

输出:

Out[23]: 
    name      group  subject  score  class_size
5   John  classrm_F  science  96.55          25
2   Mary  classrm_C  science  77.25          26
3  Steve  classrm_B  science  65.28          32