如何将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就是你想要的宽格式数据:
| group | n1 | n2 | n3 | n4 |
|---|---|---|---|---|
| 1 | 3 | 2 | 4 | 1 |
| 2 | 3 | 4 | NaN | NaN |
| 3 | 4 | 1 | 2 | 3 |
| 4 | 4 | NaN | NaN | NaN |
| 5 | 2 | 3 | 4 | NaN |
| 6 | 4 | NaN | NaN | NaN |
关键说明
- 使用
pivot_table的aggfunc='first'是因为每个组内的每个ID只会有一个排名,所以直接取第一个匹配的值即可; reindex(columns=['n1', 'n2', 'n3', 'n4'])可以确保列的顺序完全符合你的要求,即使某些ID在原始数据中出现顺序不一致也不影响;- 原始数据中不存在的组-ID组合会自动填充为
NaN(也就是你要求的NA)。
内容的提问来源于stack exchange,提问作者Apook
相关产品推荐
相关产品推荐

