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

如何在DataFrame.groupby场景下根据另一列最大值获取对应列的值

如何按年份获取DataFrame中count最大值对应的艺术家名称

嗨,我来帮你搞定这个需求!不用费劲循环遍历DataFrame的行,pandas提供了高效的分组聚合方法,能轻松实现你的目标。先理清楚你的场景:

原始DataFrame:

id YearReleased Artist count
168 2015 Muse 1
169 2015 Rihanna 3
170 2015 Taylor Swift 2
171 2016 Jennifer Lopez 1
172 2016 Rihanna 3
173 2016 Underworld 1
174 2017 Coldplay 1
175 2017 Ed Sheeran 2

期望输出:

YearReleased Artist
2015 Rihanna
2016 Rihanna
2017 Ed Sheeran

下面是两种好用的解决方案:

方法1:用groupby + idxmax快速定位最大值行

idxmax()会返回每组中count列最大值对应的行索引,我们可以用这些索引直接提取原DataFrame的对应行,再筛选需要的列:

import pandas as pd

# 先构造你的原始DataFrame
data = {
    'id': [168, 169, 170, 171, 172, 173, 174, 175],
    'YearReleased': [2015, 2015, 2015, 2016, 2016, 2016, 2017, 2017],
    'Artist': ['Muse', 'Rihanna', 'Taylor Swift', 'Jennifer Lopez', 'Rihanna', 'Underworld', 'Coldplay', 'Ed Sheeran'],
    'count': [1, 3, 2, 1, 3, 1, 1, 2]
}
df = pd.DataFrame(data)

# 获取每年count最大值对应的行索引
max_count_indices = df.groupby('YearReleased')['count'].idxmax()
# 提取对应行并只保留需要的列
result_df = df.loc[max_count_indices, ['YearReleased', 'Artist']].reset_index(drop=True)

print(result_df)

运行后输出完全符合你的期望:

YearReleased    Artist
0          2015   Rihanna
1          2016   Rihanna
2          2017  Ed Sheeran

方法2:排序后取每组首行

如果需要更灵活的处理(比如某一年有多个艺术家count值并列最大),可以先按年份和count降序排序,再分组取首行:

# 先按年份升序、count降序排序
sorted_df = df.sort_values(['YearReleased', 'count'], ascending=[True, False])
# 分组后取每组第一行(即count最大的行)
result_df = sorted_df.groupby('YearReleased').head(1).reset_index(drop=True)[['YearReleased', 'Artist']]

print(result_df)

如果某一年有多个艺术家的count值都是最大值,把head(1)换成filter(lambda x: x['count'] == x['count'].max())就能保留所有符合条件的行。

为什么不推荐循环?

循环遍历DataFrame行的效率极低,尤其是数据量变大的时候,pandas的向量化操作和分组方法都是经过底层优化的,不仅运行速度快,代码也更简洁易读,维护起来更方便。

内容的提问来源于stack exchange,提问作者Jeet Banerjee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 09:17:23