重塑多索引 pandas 数据框
Reshaping a multiindex pandas dataframe
我有一个多索引 pandas 数据框,看起来像这样
ID I II III
METRIC a b c d a b c d a b c d
2015-08-01 0 1 2 3 20 21 22 23 40 41 42 43
2015-08-02 4 5 6 7 24 25 26 27 44 45 46 47
2015-08-03 8 9 10 11 28 29 30 31 48 49 50 51
其中由日期(2015-08-01
、2015-08-02
、2015-08-03
等)、第一级列(I
、II
, III
) 是 ID
和二级列对应 METRIC
s (a
, b
, c
, d
).我想将其重塑为以下形式
METRIC a b c d
ID
I 2015-08-01 0 1 2 3
2015-08-02 4 5 6 7
2015-08-03 8 9 10 11
II 2015-08-01 20 21 22 23
2015-08-02 24 25 26 27
2015-08-03 28 29 30 31
III 2015-08-01 40 41 42 43
2015-08-02 44 45 46 47
2015-08-03 48 49 50 51
我已经(未成功)研究过使用 .pivot
、.stack
和 .melt
,但它们没有给我想要的东西。我目前循环遍历 ID
s 并构建一个 list 数据帧并将它们 concat
作为一个新的数据帧来获得我想要的。
如有任何建议,我们将不胜感激。
让我们使用 stack
、swaplevel
和 sort_index
:
df.stack(0).swaplevel(0,1).sort_index()
输出:
METRIC a b c d
ID
I 2015-08-01 0 1 2 3
2015-08-02 4 5 6 7
2015-08-03 8 9 10 11
II 2015-08-01 20 21 22 23
2015-08-02 24 25 26 27
2015-08-03 28 29 30 31
III 2015-08-01 40 41 42 43
2015-08-02 44 45 46 47
2015-08-03 48 49 50 51
您可以让 transpose
或 T
为您完成一些工作。
df.T.stack().unstack(1)
METRIC a b c d
ID
I 2015-08-01 0 1 2 3
2015-08-02 4 5 6 7
2015-08-03 8 9 10 11
II 2015-08-01 20 21 22 23
2015-08-02 24 25 26 27
2015-08-03 28 29 30 31
III 2015-08-01 40 41 42 43
2015-08-02 44 45 46 47
2015-08-03 48 49 50 51
使用@piRSquared的方法,我们可以跳过转置,只是df.unstack().unstack(1)
我有一个多索引 pandas 数据框,看起来像这样
ID I II III
METRIC a b c d a b c d a b c d
2015-08-01 0 1 2 3 20 21 22 23 40 41 42 43
2015-08-02 4 5 6 7 24 25 26 27 44 45 46 47
2015-08-03 8 9 10 11 28 29 30 31 48 49 50 51
其中由日期(2015-08-01
、2015-08-02
、2015-08-03
等)、第一级列(I
、II
, III
) 是 ID
和二级列对应 METRIC
s (a
, b
, c
, d
).我想将其重塑为以下形式
METRIC a b c d
ID
I 2015-08-01 0 1 2 3
2015-08-02 4 5 6 7
2015-08-03 8 9 10 11
II 2015-08-01 20 21 22 23
2015-08-02 24 25 26 27
2015-08-03 28 29 30 31
III 2015-08-01 40 41 42 43
2015-08-02 44 45 46 47
2015-08-03 48 49 50 51
我已经(未成功)研究过使用 .pivot
、.stack
和 .melt
,但它们没有给我想要的东西。我目前循环遍历 ID
s 并构建一个 list 数据帧并将它们 concat
作为一个新的数据帧来获得我想要的。
如有任何建议,我们将不胜感激。
让我们使用 stack
、swaplevel
和 sort_index
:
df.stack(0).swaplevel(0,1).sort_index()
输出:
METRIC a b c d
ID
I 2015-08-01 0 1 2 3
2015-08-02 4 5 6 7
2015-08-03 8 9 10 11
II 2015-08-01 20 21 22 23
2015-08-02 24 25 26 27
2015-08-03 28 29 30 31
III 2015-08-01 40 41 42 43
2015-08-02 44 45 46 47
2015-08-03 48 49 50 51
您可以让 transpose
或 T
为您完成一些工作。
df.T.stack().unstack(1)
METRIC a b c d
ID
I 2015-08-01 0 1 2 3
2015-08-02 4 5 6 7
2015-08-03 8 9 10 11
II 2015-08-01 20 21 22 23
2015-08-02 24 25 26 27
2015-08-03 28 29 30 31
III 2015-08-01 40 41 42 43
2015-08-02 44 45 46 47
2015-08-03 48 49 50 51
使用@piRSquared的方法,我们可以跳过转置,只是df.unstack().unstack(1)