如何在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
相关产品推荐
相关产品推荐

