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

如何基于ID和Year对Pandas DataFrame进行转置重构?

Pandas DataFrame 格式转换解决方案

问题描述

原始数据集代码:

import pandas as pd

df = pd.DataFrame({'ID': [1, 1, 1,1, 2,2, 2,2],
                   'Year': [2011, 2011, 2012,2012,2011,2011,2012,2012],
                   'Type': ["a","b","a","b","c/d","e","c/d","d"],
                   'Value': [10,11,12,11,13,14,14,15]})

原始数据展示:

IDYearTypeValue
012011a10
112011b11
212012a12
312012b11
422011c/d13
522011e14
622012c/d14
722012d15

需求:将上述DataFrame转换为指定目标格式,尝试过transpose和reset_index方法未得到预期结果,寻求可行方案。

解决方案

方法一:基础透视转换(ID+Type为行,Year为列)

适用于无重复(ID, Type, Year)组合的场景,直接通过pivot实现格式转换:

# 执行透视转换
result = df.pivot(index=['ID', 'Type'], columns='Year', values='Value').reset_index()
# 移除列名的层级标签,优化显示
result.columns.name = None

print(result)

输出结果:

ID Type  2011  2012
0   1    a    10    12
1   1    b    11    11
2   2  c/d    13    14
3   2    d   NaN    15
4   2    e    14   NaN

方法二:二级列结构(Type为行,ID+Year为列)

如果目标格式需要将ID和Year作为二级列,可调整参数:

result = df.pivot(index='Type', columns=['ID', 'Year'], values='Value').reset_index()
# 移除列名的层级标签
result.columns.names = [None, None]

print(result)

输出结果:

Type  (1, 2011)  (1, 2012)  (2, 2011)  (2, 2012)
0    a       10.0       12.0        NaN        NaN
1    b       11.0       11.0        NaN        NaN
2  c/d        NaN        NaN       13.0       14.0
3    d        NaN        NaN        NaN       15.0
4    e        NaN        NaN       14.0        NaN

处理重复值场景

如果数据存在重复的(ID, Type, Year)组合,使用pivot_table并指定聚合函数:

# 示例:以均值聚合重复值,可替换为sum、max等其他函数
result = df.pivot_table(index=['ID', 'Type'], columns='Year', values='Value', aggfunc='mean').reset_index()
result.columns.name = None

关键说明

  • pivot是轻量透视工具,适合无重复键的场景;pivot_table支持聚合,适用于有重复数据的情况。
  • reset_index()用于将多级索引转换为普通列,便于后续数据处理。
  • 设置columns.name = None可移除列的层级标签,让结果表格更简洁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 23:10:43