如何基于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]})
原始数据展示:
| ID | Year | Type | Value | |
|---|---|---|---|---|
| 0 | 1 | 2011 | a | 10 |
| 1 | 1 | 2011 | b | 11 |
| 2 | 1 | 2012 | a | 12 |
| 3 | 1 | 2012 | b | 11 |
| 4 | 2 | 2011 | c/d | 13 |
| 5 | 2 | 2011 | e | 14 |
| 6 | 2 | 2012 | c/d | 14 |
| 7 | 2 | 2012 | d | 15 |
需求:将上述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
相关产品推荐
相关产品推荐

