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,将多索引之一移动到多列索引之上的主要内容,如果未能解决你的问题,请参考以下文章