Pandas如何提取各Topic下Weight最高的行并保留Topic与Word列
问题分析
你原有代码存在两个核心问题:
- 分组逻辑错误:你的需求是筛选每个Topic下权重最高的行,所以
groupby的分组键应该是Topic而非不存在的Weightage列 - 语法错误:
groupby对象后直接调用方法即可,你写的groupby('Weightage')(['Topic','Word'])不符合pandas语法规范
正确实现方案
两种常用实现方式都会完整保留所有原始列信息,不需要额外处理Topic列:
方案1:排序+去重(可读性最高,适合同Topic下有多个相同最高权重的场景,默认保留第一条)
import pandas as pd # 构造测试DataFrame details = { 'Topic' : [0,0,0,0, 1,1,1, 3,3,3, 4,4], 'Word' : ['a', 'c', 'p', 'm', 'ad', 'a', 'p', 's', 'm', 'rev', 'rev', 'in'], 'Weight' : [0.5,0.2,0.1,0.05, 0.2,0.1,0.06, 0.2,0.1,0.09, 0.2,0.1] } df = pd.DataFrame(details) # 核心逻辑:按Topic升序、Weight降序排序后,去重保留每个Topic的第一条记录 df_sorted = df.sort_values(['Topic', 'Weight'], ascending=[True, False]) result = df_sorted.drop_duplicates('Topic', keep='first').reset_index(drop=True) print(result)
方案2:groupby+idxmax(性能更高,适合无重复最高权重的场景)
# 核心逻辑:取每个Topic下Weight最大值对应的行索引,直接筛选整行数据 max_idx = df.groupby('Topic')['Weight'].idxmax() result = df.loc[max_idx].reset_index(drop=True) print(result)
输出结果
两种方案得到的结果一致:
Topic Word Weight 0 0 a 0.50 1 1 ad 0.20 2 3 s 0.20 3 4 rev 0.20
内容的提问来源于stack exchange,提问作者rondevo
相关产品推荐
相关产品推荐

