Python pandas按列唯一值分组筛选最大值对应行的方法
pandas实现按title分组取hours_viewed最大值对应整行
你要的分组后保留数值列最大值所在完整行的需求,用pandas可以通过以下两种常用方法实现,运行结果完全匹配你给出的预期输出。
示例数据构造
先复现你给出的测试数据:
import pandas as pd df = pd.DataFrame({ 'week': [1, 2, 3, 4, 5, 6], 'category': ['Eng', 'Eng', 'Non-Eng', 'Non-Eng', 'Eng', 'Eng'], 'title': ['aaa', 'aaa', 'bbb', 'bbb', 'ccc', 'ccc'], 'hours_viewed': [100, 95, 105, 100, 80, 115] })
方法1:groupby + idxmax(推荐,逻辑最严谨)
idxmax()会直接返回每个分组下hours_viewed列最大值对应的原始行索引,通过loc直接筛选对应行即可,是这类需求的最通用实现:
result = df.loc[df.groupby('title')['hours_viewed'].idxmax()] # 如果需要重置连续行索引可以追加 .reset_index(drop=True) print(result)
运行输出:
week category title hours_viewed 0 1 Eng aaa 100 2 3 Non-Eng bbb 105 5 6 Eng ccc 115
方法2:排序 + 去重(写法更直观)
先将全表按hours_viewed降序排序,再按title列去重、仅保留第一条记录(也就是每个title对应的最大值记录),如果需要还原原表的week顺序可以最后追加排序:
result = df.sort_values('hours_viewed', ascending=False) \ .drop_duplicates(subset='title', keep='first') \ .sort_values('week') \ .reset_index(drop=True)
注意:如果同一个title下存在多条
hours_viewed取值并列最大的记录,以上两种方法默认保留最早出现的那条记录,符合绝大多数场景的使用需求。
内容的提问来源于stack exchange,提问作者Chi Wong
相关产品推荐
相关产品推荐

