我有以下时间序列数据帧:

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

我需要reshape 巨 Python Pandas 的数据帧,如下所示:

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

我的代码是

df_table= pd.pivot_table(df, values=df.columns, index="year", 
columns='month',sort=False)

我的结果是:

       A                  ...   D                
month  1   2   3   4   5   ...  8   9   10  11  12
year                       ...                    
2012   54  21  53  95  39  ...  47  41  40  91   9
2013   91  36  51  32  17  ...  68   8  36  89  48
2014   44   9  26  28  47  ...   1   9  23  55  21
2015   35  36  68  71  67  ...   5  88  34  56  80
2016   70  14  48  45  20  ...  81  47  33  17  22
2017   68  43  25  69  13  ...  76  17  79  10  79
2018   94   9   9  40  19  ...  76   5  54  27  41
2019   82  84  93  65  20  ...  54  92  49  24  91
2020   95  66  12  60  45  ...  66  47  19  35  42
2021   95  78  37  31  23  ...  78  12  78  70  43

[10 rows x 48 columns]  

所以我需要知道我的代码或任何建议中有什么问题.

推荐答案

您首先需要达到melt:

out = (df.melt(['month', 'year'], var_name='City', ignore_index=False)
         .pivot_table(index=['year', 'City'], columns='month', values='value', fill_value=0)
         .reset_index().rename_axis(columns=None)
      )

NB. if you want, 100 will give your the month name.

输出:

    year City   1   2   3   4   5   6   7   8   9  10  11  12
0   2012    A  17  58  41  46  14  42   6  76  20  79  49  64
1   2012    B  79  31  57  82  99  84  68  52  99  13  69  95
2   2012    C   4   1  35  91  53  75  47  78  58  85  41  69
3   2012    D  42  65  11   0  12  68   3  15  23  48  35  94
4   2013    A   0  48  42   0  23  62  82  81  41  10   2  54
5   2013    B  50  93  77  10  59  35  46  50  58  86  51   0
6   2013    C  36   3  21  43   2  94  99  27  65  43  80  38
7   2013    D  34  98  73  58  98  67  20  14  36  11  32  19
8   2014    A  46  77   3  40  72  67   4  77  24  80  33  31
9   2014    B  42  30  94  72  26  61  67  75  29  60  32  13
10  2014    C  56  24  98  19  66  14  11  56  21  61  70  71
11  2014    D  60   2  13  95  52  96  86  16  25  83  85  56
12  2015    A  24  40  38  44  82  86  43  10   2  23  20  35
13  2015    B  79  54  93  88   3  61  32  54  27  53  53  39
14  2015    C  41  79   1  24  76  69  11  37  83  51  29   9
15  2015    D  18  11  95  67  35  87  84  28  89  46  67  73
16  2016    A  41  90   9  71  97  88   0  53  61  91  25  29
17  2016    B  23  50  10  39  44  33  75  80   1  40  67  33
18  2016    C   3   3  27  61  34   5  34  62  81  36  35  18
19  2016    D  46  31  45  85  34  36  69   8  35  48  30  17
20  2017    A  93  12  85  22  71  83  46  96  81  63  24   8
21  2017    B  84  44  39  30  18  49  21  91  58  16  63  56
22  2017    C   2  66  39  17  92  41  73  73   0  36  67  91
23  2017    D  69  91  75  70  43  93  89  28  86  94  51  93
24  2018    A  87  71  81  92  42  20  99  61   8  11  45  49
25  2018    B  32  87  55  36  14  82  83  13  79   4  26  91
26  2018    C  19  13  64  25  86  68   7   5  79  39  74  51
27  2018    D  72  58  75  32  28  22  72   0  53  92  52  99
28  2019    A  18  53  18  70  59  58  13   8  22  99  84  16
29  2019    B  34  58  45  53  80  49  70  13  79   6  89  56
30  2019    C  51  43  87  48  26  73  38   7  89  81  66  23
31  2019    D  30  55  65  94  35  44  39  80   8  71  60  24
32  2020    A   4  54  57  33   7  83   3  36  10  63   9  83
33  2020    B  49  25  23  53   9  36  42  68  94  31  60  76
34  2020    C  87  20  27  51  54  81  65  80  91  20  91  18
35  2020    D  30  97  29  86   0  20  20  47  43  70  35  74
36  2021    A  98  12  39  99  98  28  51  33  84  91  83  91
37  2021    B  97  58  24  69  40  68  73   7   7  67  95  30
38  2021    C  43   1  58   6  60  26  53  94  67  84   0  73
39  2021    D   3   0  36   3  33  96  69  72  85  71   5  83

Python相关问答推荐

在Python中,如何才能/应该使用decorator 来实现函数多态性?

telegram 机器人API setMyName不起作用

创建带有二维码的Flask应用程序,可重定向到特定端点

使用多个性能指标执行循环特征消除

Python中的负前瞻性regex遇到麻烦

如何在具有重复数据的pandas中对groupby进行总和,同时保留其他列

如何将ctyles.POINTER(ctyles.c_float)转换为int?

将整组数组拆分为最小值与最大值之和的子数组

删除最后一个pip安装的包

如何让剧作家等待Python中出现特定cookie(然后返回它)?

Pandas - groupby字符串字段并按时间范围 Select

从dict的列中分钟

如何创建一个缓冲区周围的一行与manim?

如果值发生变化,则列上的极性累积和

Pandas DataFrame中行之间的差异

Odoo 16使用NTFS使字段只读

实现神经网络代码时的TypeError

如何启动下载并在不击中磁盘的情况下呈现响应?

不允许 Select 北极滚动?

将链中的矩阵乘法应用于多组值