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

如何用Python Pandas对含多值列的表格进行水平透视?

使用Pandas实现表格水平透视(行转列)

需求说明

原始表格格式:

Ticker  Financial Ratio                  2001     2002    2003    
ARKR    Net Profit Margin                -0.1931  0.052   -0.0187
ARKR    Return on Assets                 0        0       0
ARKR    Current Ratio                    1.3419     1.2096  0.7031
ARMK    Net Profit Margin                -0.1931  0.052   -0.0187
ARMK    Return on Assets                 0        0       0
ARMK    Current Ratio                    1.3419     1.2096  0.7031

需要转换为:仅保留Ticker为纵向列,将年份与财务指标组合为新列名,对应数值平铺到一行:

Ticker  2001 Net Profit Margin  2001 Return on Assets  2001 Current Ratio  2002 Net Profit Margin  ...
ARKR    -0.1931                 0                      1.3419              0.052                   ...
ARMK    -0.1931                 0                      1.3419              0.052                   ...

正确实现代码

import pandas as pd
from io import StringIO

# 读取数据(示例用字符串读取,实际替换为pd.read_csv('database_raw.csv', skipinitialspace=True))
data = """Ticker  Financial Ratio                  2001     2002    2003    
ARKR    Net Profit Margin                -0.1931  0.052   -0.0187
ARKR    Return on Assets                 0        0       0
ARKR    Current Ratio                    1.3419     1.2096  0.7031
ARMK    Net Profit Margin                -0.1931  0.052   -0.0187
ARMK    Return on Assets                 0        0       0
ARMK    Current Ratio                    1.3419     1.2096  0.7031"""
df = pd.read_csv(StringIO(data), sep='\s+', skipinitialspace=True)

# 1. 将年份列转为长格式,拆分年份和对应数值
melted_df = df.melt(
    id_vars=['Ticker', 'Financial Ratio'],
    var_name='Year',
    value_name='Value'
)

# 2. 组合年份与财务指标,生成新列名
melted_df['Metric'] = melted_df['Year'] + ' ' + melted_df['Financial Ratio']

# 3. 透视得到目标格式,重置索引让Ticker回到普通列
result_df = melted_df.pivot(
    index='Ticker',
    columns='Metric',
    values='Value'
).reset_index()

# 清除列索引的名称,让格式更简洁
result_df.columns.name = None

# 输出结果
print(result_df)

代码说明

  • melt():把原始宽格式中的年份列(2001/2002/2003)拆分为Year(年份)和Value(对应指标值),保留Ticker和Financial Ratio作为标识列,将数据转为长格式。
  • 列名拼接:将Year和Financial Ratio合并为新的指标名称,比如2001 Net Profit Margin,满足目标格式的列名要求。
  • pivot():以Ticker为行索引,新生成的Metric为列,Value为填充值,实现行转列的透视效果;reset_index()将Ticker从索引转回普通列,columns.name = None清除列索引的冗余名称。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 21:17:28