如何在DataFrame中提取每个类别对应的最低分数记录?
提取每个类别对应的最小值记录(含完整行信息)
嘿,我来帮你搞定这个需求!针对你给出的DataFrame,要提取每个Name分组下Score最小的那条记录(包含ID、Name、Score),这里有两种实用的pandas实现方案,都能完美得到你想要的结果:
方法一:用groupby + idxmin()精准定位
这个方法的思路是先找到每个分组里Score最小的行的索引,再用这些索引去原DataFrame里捞对应行,步骤清晰精准:
import pandas as pd # 先构造你的示例DataFrame data = { 'ID': [1,2,3,4,5,6,7], 'Name': ['A','A','B','B','C','C','C'], 'Score': [15.1,20.5,15.2,8.2,43.2,12.1,18.0], 'Age': [21,12,18,22,12,15,22] } df = pd.DataFrame(data) # 找出每个Name分组中Score最小的行的索引 min_score_row_indexes = df.groupby('Name')['Score'].idxmin() # 根据索引提取对应行,再筛选出你需要的ID、Name、Score列 final_result = df.loc[min_score_row_indexes, ['ID', 'Name', 'Score']].reset_index(drop=True) print(final_result)
运行这段代码后,输出就是你想要的格式:
ID Name Score 0 1 A 15.1 1 4 B 8.2 2 6 C 12.1
方法二:排序后去重(更直观易懂)
如果你更喜欢直观的操作逻辑,可以先给DataFrame排序,再去掉重复的Name项,只保留每个组的第一条(也就是Score最小的那条):
# 先按Name分组,再对每个组内的Score升序排序,然后保留每个Name的第一条记录 final_result = df.sort_values(['Name', 'Score']) \ .drop_duplicates(subset='Name', keep='first') \ [['ID', 'Name', 'Score']] \ .reset_index(drop=True) print(final_result)
这个方法和第一种结果完全一致,适合刚接触pandas的朋友理解。
小提醒
- 如果某个
Name分组里有多个相同的最低Score,这两种方法都会保留第一个出现的那条记录;要是你想保留所有最低Score的记录,把drop_duplicates里的keep='first'改成keep=False,或者用布尔索引筛选就行。 - 最后加个
reset_index(drop=True)是为了把结果的索引重置成从0开始的连续数字,看起来更整洁。
内容的提问来源于stack exchange,提问作者R Sem
相关产品推荐
相关产品推荐

