如何重塑多索引数据框

Posted

技术标签:

【中文标题】如何重塑多索引数据框【英文标题】:How to reshape multiindex dataframe 【发布时间】:2017-08-02 16:45:30 【问题描述】:

我有一个多索引DataFrame,我想将其列用作行,然后将列重命名为度量的名称。

arrays = [np.array(['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux']),
          np.array(['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two'])]
df = pd.DataFrame(np.random.randn(8, 4), index=arrays)

                0         1         2         3
bar one  0.049409  0.533468  0.528360 -1.437937
    two  2.081377 -0.945535  0.237531 -0.781147
baz one  0.005216  1.158222 -1.178232 -1.470667
    two -0.043834 -0.320864 -1.568357  0.803620
foo one -0.758539 -1.009726  0.139992  0.281034
    two -1.806000  0.206872 -0.728195  1.051045
qux one -1.106591 -0.621868 -1.139649 -0.185527
    two  0.176220 -0.961532  3.587891  0.627658

我想让我的数据框看起来像这样:

            measure_name
bar one  0  0.049409
    two  1  -0.945535
    one  2  0.528360
    two  3  -0.781147

我不知道该怎么做。我尝试了pd.melt(),但这摆脱了多索引,我需要有一种方法将列中的值与索引联系起来。

提前致谢!

【问题讨论】:

您可以设置种子并重新打印您的数据吗?我们更容易理解您想要什么。 我不知道什么是种子? np.random.seed(42) 没关系,piRSquared 知道了。 哦,是的,对不起,我从文档中得到了示例 df,这就是所使用的。 【参考方案1】:

IIUC:

df.stack().to_frame('measure_name')

           measure_name
bar one 0      0.562183
        1      2.090766
        2     -0.164342
        3      0.499693
    two 0     -0.174269
        1     -0.997726
        2      0.820774
        3      0.243022
baz one 0     -0.158621
        1      0.520945
        2     -0.356393
        3      0.465289
    two 0     -1.187833
        1      0.886986
        2      1.415511
        3      0.940117
foo one 0     -0.010860
        1      0.126255
        2      1.131045
        3     -0.899853
    two 0     -1.121544
        1     -0.327184
        2      0.074396
        3      0.214501
qux one 0     -0.028317
        1     -1.476114
        2      1.415711
        3     -0.355655
    two 0      0.285167
        1      1.535384
        2      0.074326
        3     -1.860993

【讨论】:

非常感谢!这正是我所需要的!我不知道.to_frame() 做了什么。 @rubito 不客气。很高兴我能帮上忙。 @ScottBoston 还很好地演示了如何使用 pd.DataFrame.meltmelt 是一个非常有用的方法,他的解决方案很好地解释了在这种情况下如何使用它。【参考方案2】:

如果你想melt,但@piRSquared 解决方案更好:

(df.reset_index()
  .melt(id_vars=['level_0','level_1'],value_name='measure_name')
  .set_index(['level_0','level_1','variable'])
  .rename_axis([None]*3)
  .sort_index())

输出:

           measure_name
bar one 0     -1.442157
        1     -0.738047
        2     -1.724773
        3      0.952186
    two 0      0.470124
        1      0.296891
        2      0.208106
        3      1.050396
baz one 0      1.480720
        1      1.054237
        2     -0.195591
        3      0.994051
    two 0     -0.671022
        1     -0.587526
        2     -0.664228
        3      1.474525
foo one 0     -0.427713
        1     -0.083597
        2     -0.460711
        3      0.646449
    two 0     -0.140055
        1      1.029966
        2      0.431720
        3     -0.902373
qux one 0     -3.126427
        1      0.904205
        2     -0.592984
        3      1.812544
    two 0     -1.450957
        1      1.453259
        2     -0.929294
        3     -0.147798

【讨论】:

以上是关于如何重塑多索引数据框的主要内容,如果未能解决你的问题,请参考以下文章

如何更改多索引数据框中的索引

如何使用单个索引更新多索引数据框中的记录

如何使用 Pandas 将多索引系列加入单个索引数据框?

如何重新索引多索引熊猫数据框?

如何更改熊猫数据框中多索引的外层索引?

如何将多索引列转换为熊猫数据框的单索引列?