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

Pandas中实现数据行列转置(pivot/melt)的技术求助

Pandas中实现数据行列转置(pivot/melt)的技术求助

嘿,我懂你这种搞不清pivot和melt用法的困惑!其实你要的这种把年份转成列、指标(cumul/evolution/nb/pct)转成行的需求,用Pandas很容易实现,我给你两种靠谱的方法,一步步来~

首先先确认下你的原始数据(方便对照):

import pandas as pd
import numpy as np

data = {'year': [2023, 2022, 2021, 2020, 2019, 2018, 2017, 2016, 2015, 2014],
        'cumul': [0.0, 77.0, 100.0, -200.0, 114.0, -11.0, -27.0, 89.0, 195.0, -18.0],
        'evolution': [14.4, -10.3, 28.0, -8.1, 27.5, -10.5, 8.8, 7.5, 10.0, 1.1],
        'nb': [0, 3, 1, 2, 3, 1, 1, 3, 7, 2],
        'pct': [np.nan, 26.0, 100.0, -100.0, 38.0, -11.0, -27.0, 30.0, 28.0, -9.0]}

df = pd.DataFrame(data)

方法1:直接转置(简洁高效,适合全指标转置)

这种方法适合你需要把所有指标都转成行的场景,步骤很简单:

  1. 把year列设置为DataFrame的索引
  2. 用transpose()方法直接转置行列
  3. 重置索引并调整列名让结果更清晰

代码实现:

# 设置year为索引,然后转置
df_transposed = df.set_index('year').transpose()
# 重置索引,把原来的指标名从索引变成一列
df_transposed = df_transposed.reset_index()
# 给列重命名,让结果更易读
df_transposed.rename(columns={'index': '指标'}, inplace=True)

# 查看结果
print(df_transposed)

运行后你就能得到:行是cumul/evolution/nb/pct,列是各个年份的格式,完全符合你的需求~

方法2:melt + pivot(灵活可控,适合复杂场景)

如果之后你需要只转置部分指标,或者处理更复杂的多维度数据,melt+pivot的组合会更灵活:

  1. 先用melt把宽格式的数据转成“长格式”:保留year列,把其他指标列拆成“指标名”和“对应数值”两列
  2. 再用pivot把长格式转回你要的宽格式:以“指标名”为行,“年份”为列,填充对应数值

代码实现:

# 第一步:melt转长格式
df_melted = df.melt(
    id_vars='year',  # 保留不转的列
    var_name='指标',  # 原来的列名变成新列的名字
    value_name='数值'  # 原来的数值对应的列名
)

# 第二步:pivot转成目标格式
df_pivoted = df_melted.pivot(
    index='指标',  # 作为行的列
    columns='year',  # 作为列的列
    values='数值'  # 填充的数值列
).reset_index()

# 查看结果
print(df_pivoted)

比如如果你只想转置cumul和evolution,只需要在melt里加个value_vars=['cumul', 'evolution']参数就行,非常灵活~

备注:内容来源于stack exchange,提问作者Johann

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 16:00:26