Pandas DataFrame值列转换:将值转列、年份转为值的最简方法
Pandas 值与列名转换最简实现方案
嘿,这个需求我之前处理过类似的报表转换,用Pandas的数据重塑组合操作就能一步链式调用搞定,完全贴合你的格式要求,不需要复杂的循环或者额外处理。
先构造原始测试数据
方便你直接复制测试:
import pandas as pd # 还原你提供的原始DataFrame df = pd.DataFrame({ 'Value': ['Employees', 'Computers', 'Employees', 'Computers', 'Monitors'], '2013': [10, 20, 4, 1, 5], '2014': [12, 2, 13, 8, 1], 'Company Name': ['Aviators', 'Aviators', 'Mouses', 'Mouses', 'Mouses'] })
核心转换代码(最简链式调用)
# 一步完成所有格式转换 result = (df # 第一步:把年份列(2013/2014)转成行数据,生成Year和Count列 .melt(id_vars=['Value', 'Company Name'], var_name='Year', value_name='Count') # 第二步:把Value列的内容转成新列,按公司+年份分组填充数据 .pivot_table(index=['Company Name', 'Year'], columns='Value', values='Count', fill_value=None) # 第三步:把索引转成普通列,调整列顺序匹配需求 .reset_index() .reindex(columns=['Year', 'Employees', 'Computers', 'Monitors', 'Company Name']) # 可选:匹配你示例中的列名大小写 .rename(columns={'Company Name': 'Company name'}) )
关键步骤解释
melt函数:把原始宽表中的2013、2014列「融化」成Year列,对应的数值存入Count列,保留Value和Company Name作为分组标识,这一步实现了把年份从列转为行数据的核心需求。pivot_table函数:把Value列的每个唯一值(Employees/Computers/Monitors)转成新的列,用Company Name+Year作为行的唯一标识,自动填充缺失值为NaN(完美匹配你示例中的空值)。reset_index+reindex:把之前作为索引的Company Name和Year转成普通列,再手动调整列的顺序,让Year在最前面,Company name在最后一列,完全符合你要求的格式。
最终输出结果
运行后print(result)会得到和你示例完全一致的格式:
Year Employees Computers Monitors Company name 0 2013 10.0 20.0 NaN Aviators 1 2014 12.0 2.0 NaN Aviators 2 2013 4.0 1.0 5.0 Mouses 3 2014 13.0 8.0 1.0 Mouses
内容的提问来源于stack exchange,提问作者George
相关产品推荐
相关产品推荐

