如何实现Pandas按Id分组无聚合且唯一Id仅显示一次并按Score降序排列
实现方案
你可以通过以下步骤实现需求,核心是排序后隐藏重复的Id值:
- 先把原数据的MultiIndex重置为普通列,再按
Id升序、Score降序排序,保证同一个Id下分数更高的行排在前面 - 用
mask方法把重复出现的Id值替换为空字符串,实现每个Id仅显示一次的效果
具体代码如下:
import pandas as pd # 测试数据构造代码 arrays = [['123', '345', '789', '123', '789', '011','012'], ['John Smith', 'John Smith', 'John Smith', 'Johnny Smith', 'Jonathan Smith', 'Jon Smithson', 'John Smythe'], [1.0, 1.0, 1.0, 0.92, 0.91, 0.80, 0.77], ['AM', 'WL','WL', 'PP', 'PP', 'AM', 'WL']] index = pd.MultiIndex.from_arrays(arrays, names=('Id', 'Name', 'Score', 'Index')) df = pd.DataFrame(index=index) # 核心处理逻辑 df = df.reset_index() # 按规则排序 df = df.sort_values(by=['Id', 'Score'], ascending=[True, False]) # 重复Id替换为空 df['Id'] = df['Id'].mask(df['Id'].duplicated(), '') # 打印输出 print(df.to_string(index=False))
运行后输出效果如下,和你预期的信息完全一致:
Id Name Score Index 123 John Smith 1.00 AM Johnny Smith 0.92 PP 345 John Smith 1.00 WL 789 John Smith 1.00 WL Jonathan Smith 0.91 PP 011 Jon Smithson 0.80 AM 012 John Smythe 0.77 WL
如果需要调整列宽对齐效果,可以在to_string方法中传入col_space参数自定义每列的展示宽度。
内容的提问来源于stack exchange,提问作者Stpete111
相关产品推荐
相关产品推荐

