我正在尝试从“初始数据框”中看到的视图中过滤以下数据框至“所需输出”中显示的内容
初始数据框
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')
任何帮助将不胜感激。
答案 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