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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 17:02:07