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

如何实现Pandas按Id分组无聚合且唯一Id仅显示一次并按Score降序排列

实现方案

你可以通过以下步骤实现需求,核心是排序后隐藏重复的Id值:

  1. 先把原数据的MultiIndex重置为普通列,再按Id升序、Score降序排序,保证同一个Id下分数更高的行排在前面
  2. 用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 14:36:07