You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 10:17:52