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

如何将含月份索引与年份表头的DataFrame转换为合并表头与索引作为新列名的单行DataFrame

解决方法

这问题我熟,用pandas的话几步就能搞定,给你两种方案,按需选择:

简洁版(一行核心代码)

先看最省事的写法,利用pandas的stack()和索引重命名快速转换:

import pandas as pd

# 构造你提供的示例DataFrame
data = {
    2021: [1,2,2,2,2,4,2,2,7,2,2,2],
    2020: [7,4,4,4,4,4,4,4,4,4,4,4],
    2019: [3,5,5,6,5,5,5,8,5,5,5,5]
}
index = ['jan','feb','mar','apr','may','jun','jul','aug','sep','oct','nov','dec']
df = pd.DataFrame(data, index=index)

# 核心转换逻辑
result = pd.DataFrame(df.stack().rename(lambda x: f"{x[1]}-{x[0]}")).T

步骤解释:

  • df.stack():把原DataFrame的年份列"压缩"成行,生成一个带**多级索引(月份、年份)**的Series,每个元素对应「月份-年份-数值」的组合
  • .rename(lambda x: f"{x[1]}-{x[0]}"):把多级索引的两个元素(年份是索引第2位,月份是第1位)拼接成年份-月份的格式,作为新的索引名
  • .T:转置Series,将其转换为一行的DataFrame

分步理解版(适合新手)

如果想更清晰地看到每一步的转换过程,可以用melt()方法拆分重组:

import pandas as pd

# 同样先构造示例DataFrame
data = {
    2021: [1,2,2,2,2,4,2,2,7,2,2,2],
    2020: [7,4,4,4,4,4,4,4,4,4,4,4],
    2019: [3,5,5,6,5,5,5,8,5,5,5,5]
}
index = ['jan','feb','mar','apr','may','jun','jul','aug','sep','oct','nov','dec']
df = pd.DataFrame(data, index=index)

# 步骤1:把月份索引转为普通列
df_with_month_col = df.reset_index().rename(columns={'index': 'month'})

# 步骤2:将年份列转为行,生成「月份-年份-数值」的长格式数据
melted = df_with_month_col.melt(id_vars='month', var_name='year', value_name='value')

# 步骤3:拼接年份和月份,生成目标列名
melted['target_col'] = melted['year'].astype(str) + '-' + melted['month']

# 步骤4:转换为一行的宽格式DataFrame
result = pd.DataFrame([melted.set_index('target_col')['value'].to_dict()])

两种方法最终都会生成你想要的、仅含一行且列名为年份-月份格式的DataFrame。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.01 02:03:13