使用Python Pandas重塑多变量时间序列数据问题咨询
多变量时间序列DataFrame重塑问题解决方法
原构造代码
import pandas as pd import numpy as np df = pd.DataFrame(np.random.randint(0,100,size=(120, 4)), columns=list('ABCD')) df['date']=pd.date_range(start="2012-01-01", #end='2022-12-01', periods=1 * 120, freq='MS') df.set_index('date',inplace=True,drop=True) df['month']=df.index.month df['year']=df.index.year
期望输出格式
Year City Jan Feb ... Dec 2012 A 10 15 12 2013 A 13 17 10 2014 A 12 10 15 ... ... ... ... ... 2012 B 30 40 33 2013 B 16 22 16 2014 B 7 24 44 ... ... ... ... ... ... ... ... ... ... 2021 D 19 17 45
原代码问题分析
- 未拆分City维度:原DataFrame中A/B/C/D是不同城市,属于列维度,原代码未将其转换为行维度的
City字段,导致透视后无法按城市分组展示。 - values参数错误:原代码传入
df.columns作为values,包含了month和year这两个分组字段,会引入无效数据参与计算。 - 月份格式不匹配:原代码用数字作为月份列名,与期望的英文缩写(Jan/Feb等)不符。
- 索引设置不完整:期望输出的行维度是
Year+City组合,原代码仅用year作为index,无法区分同一年份下的不同城市数据。
修正方案及代码
步骤1:将宽格式转为长格式
先把A/B/C/D列转换为City(类别)和Value(数值)的长格式,保留year和month字段:
df_long = df.melt(id_vars=['year', 'month'], value_vars=['A', 'B', 'C', 'D'], var_name='City', value_name='Value')
步骤2:重塑为目标格式
使用pivot_table设置正确的索引、列和值,同时将数字月份转为英文缩写,并调整结构:
# 转换月份为英文缩写 df_long['month_name'] = df_long['month'].apply(lambda x: pd.to_datetime(str(x), format='%m').strftime('%b')) # 生成透视表 df_table = pd.pivot_table(df_long, values='Value', index=['year', 'City'], columns='month_name', aggfunc='first', # 每个year+City+month对应唯一值,用first即可 sort=False) # 重置索引,让year和City成为普通列,调整列顺序为1-12月 month_order = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] df_table = df_table.reindex(columns=month_order).reset_index() # 重命名列名匹配期望格式 df_table.rename(columns={'year': 'Year'}, inplace=True)
执行后即可得到符合要求的表格格式。
内容的提问来源于stack exchange,提问作者sazaki
相关产品推荐
相关产品推荐

