如何将含月份索引与年份表头的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
相关产品推荐
相关产品推荐

