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

如何将多级索引Pandas Series转换为单列DataFrame用于折线图绘制?

解决多级索引Series转日期格式DataFrame的问题

嘿,我懂你现在的困扰!你用unstack()得到的是宽格式的矩阵结果,但你需要的是按时间顺序排列的长格式DataFrame对吧?其实你完全不需要用unstack(),核心是把你的多级索引(Year+Month)合并成日期,再重置索引就好啦。

方法一:直接重构索引并转换

这是最简洁的方式,直接利用Pandas的日期构造函数把多级索引转成日期:

import pandas as pd

# 假设你的多级索引Series叫series
# 将Year和Month层级转换成日期索引
series.index = pd.to_datetime({
    'year': series.index.get_level_values('Year'),
    'month': series.index.get_level_values('Month'),
    'day': 1  # 因为没有日信息,默认设为当月1号
})

# 重置索引,得到目标结构
result_df = series.reset_index(name='Value').rename(columns={'index': 'Date'})

# 可选:如果想要YYYY-MM格式的字符串日期,而不是datetime类型
result_df['Date'] = result_df['Date'].dt.strftime('%Y-%m')

运行后你会得到完全符合需求的DataFrame:

Date  Value
0  2012-01    444
1  2012-02    222
2  2012-03    333
3  2012-04   1101

方法二:先转索引为DataFrame再拼接

如果你更直观地想处理索引的每一部分,可以先把多级索引转成普通DataFrame,再构造日期:

# 把多级索引转换成DataFrame(不保留索引)
index_df = series.index.to_frame(index=False)

# 构造YYYY-MM格式的日期字符串,确保月份是两位数
index_df['Date'] = index_df['Year'].astype(str) + '-' + index_df['Month'].astype(str).str.zfill(2)

# 合并日期和原Series的值
result_df = pd.DataFrame({
    'Date': index_df['Date'],
    'Value': series.values
})

为什么unstack()不适用?

你用unstack(level=0)或者level=1得到矩阵结果,是因为unstack()的作用是将多级索引的某一层展开为列(或行),本质是把数据从长格式转成宽格式,用来对比不同年份同月份的数据很合适,但完全不是你要的按时间序列排列的结构~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:46:44