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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:21:57