Pandas,将多索引之一移动到多列索引之上

Posted

技术标签:

【中文标题】Pandas,将多索引之一移动到多列索引之上【英文标题】:Pandas, move one of multi-index on top of multi-column indexes 【发布时间】:2015-05-18 11:32:44 【问题描述】:

如果我有一个数据框的多级列和多级索引

column_level1               a1      | a2
                           ----+----|----+----
column_level2               b1 | b2 | b3 | b4

index1 | index2 | index3
-------+--------+--------+-----+----+----+-----
   0   |   c1   |   d1   |  1  |  2 |  3 |  4  |
   0   |   c2   |   d3   |  5  |  6 |  7 |  8  |    

如何重塑我的数据框以将我的索引之一移动到 columns_level 之上? 假设我想要将当前的 index2 放在 column_level0 上。

我还需要一些有效的解决方案来解决这个问题。

我目前的解决方案是通过以下方式使用stack/unstack:

df.stack().stack().unstack(index2).unstack().unstack()

但是在巨大的数据帧上使用这种实现方式最终会消耗大量 RAM 并花费大量时间。

【问题讨论】:

Turn Pandas Multi-Index into column 的可能重复项 【参考方案1】:

如果你有:

import numpy as np
import pandas as pd

columns = pd.MultiIndex.from_arrays([['a1','a1','a2','a2'], ['b1','b2','b3','b4']])
index = pd.MultiIndex.from_tuples([(0,'c1','d1'), (0, 'c2', 'd3')])
df = pd.DataFrame(np.arange(1,9).reshape(2,-1), columns=columns, index=index)
#         a1    a2   
#         b1 b2 b3 b4
# 0 c1 d1  1  2  3  4
#   c2 d3  5  6  7  8

那么您可以使用reorder_levels 来避免(大部分)这些堆栈/取消堆栈调用:

df.unstack(level=1).reorder_levels([2,0,1], axis=1)

产量

      c1  c2  c1  c2  c1  c2  c1  c2
      a1  a1  a1  a1  a2  a2  a2  a2
      b1  b1  b2  b2  b3  b3  b4  b4
0 d1   1 NaN   2 NaN   3 NaN   4 NaN
  d3 NaN   5 NaN   6 NaN   7 NaN   8

【讨论】:

以上是关于Pandas,将多索引之一移动到多列索引之上的主要内容,如果未能解决你的问题,请参考以下文章

Pandas:在多索引数据帧中重新索引和插值

在写入Excel时,“解析”一个pandas多索引

将一些 DataFrame 列重新索引为多索引

Pandas 多索引数据框 - 从多索引中的一个索引中选择最大值

pandas:选择索引,然后选择多索引切片上的列

pandas:在多索引数据框中转换索引类型