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

如何将Pandas长格式DataFrame按ID元素转换为宽格式并构建排名评分体系

解决Pandas长转宽格式并按规则计算评分的需求

没问题,我来帮你实现这个数据转换的需求!咱们一步步来处理:

步骤1:准备原始数据

首先先把你提供的长格式DataFrame用代码还原出来:

import pandas as pd

# 原始长格式数据
data = {
    'rank': [1,2,3,4,1,2,1,2,3,4,1,1,2,3,1],
    'group': [1,1,1,1,2,2,3,3,3,3,4,5,5,5,6],
    'ID': [3,1,2,4,2,1,2,4,3,1,1,3,2,1,1]
}
X = pd.DataFrame(data)

步骤2:计算每个ID的评分

根据规则,评分是5 - 该ID在组内的rank,所以先新增一个评分列:

X['score'] = 5 - X['rank']

步骤3:转换为宽格式

用pivot_table来实现长转宽,指定行索引为group,列名为ID,填充值为计算好的score,同时处理缺失值为NA:

# 转宽格式,每个组-ID组合只取唯一的评分值
wide_df = X.pivot_table(index='group', columns='ID', values='score', aggfunc='first')

# 把列名从ID数字改成n1、n2、n3、n4的格式
wide_df.columns = [f'n{col}' for col in wide_df.columns]

# 确保列的顺序是n1、n2、n3、n4,缺失的列自动填充NA
wide_df = wide_df.reindex(columns=['n1', 'n2', 'n3', 'n4'])

# 把group从索引转为普通列
wide_df = wide_df.reset_index()

最终结果

运行完上面的代码后,wide_df就是你想要的宽格式数据:

groupn1n2n3n4
13241
234NaNNaN
34123
44NaNNaNNaN
5234NaN
64NaNNaNNaN

关键说明

  • 使用pivot_table的aggfunc='first'是因为每个组内的每个ID只会有一个排名,所以直接取第一个匹配的值即可;
  • reindex(columns=['n1', 'n2', 'n3', 'n4'])可以确保列的顺序完全符合你的要求,即使某些ID在原始数据中出现顺序不一致也不影响;
  • 原始数据中不存在的组-ID组合会自动填充为NaN(也就是你要求的NA)。

内容的提问来源于stack exchange,提问作者Apook

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 00:02:49