Pandas多级索引到行

时间:2015-08-12 10:17:27

标签: python pandas

我正在尝试转换此DataFrame:

>>> df
D1     D2  
S1 S2  S1 S2
0  -4  1  -6
1  -5  2  -7
3  -8  3  -9

类似于:

>>> df
    0    1    2    3
D1  -4   -5   NaN  -8
D2  NaN  -6   -7   -9

基本上,(D1,S1)(D2,S1)列中的值需要合并到列名中,而(D1,S2)(D2,S2)列中的值将成为唯一的数据值。

我怎样才能简单有效地实现这一目标?

1 个答案:

答案 0 :(得分:3)

所需的DataFrame在索引中包含D s。 stack将列级值移动到索引中。因此,考虑调用stack

是很自然的
In [43]: result = df.stack(level=0); result
Out[43]: 
      S1  S2
0 D1   0  -4
  D2   1  -6
1 D1   1  -5
  D2   2  -7
2 D1   3  -8
  D2   3  -9

所需的DataFrame在索引中只有D s,所以让我们删除外层值:

In [44]: result.index = result.index.droplevel(0); result
Out[44]: 
    S1  S2
D1   0  -4
D2   1  -6
D1   1  -5
D2   2  -7
D1   3  -8
D2   3  -9

我们现在希望S1列成为列级值。这可以通过首先将S1列移动到索引中来完成,

In [45]: result = result.set_index('S1', append=True); result
Out[45]: 
       S2
   S1    
D1 0   -4
D2 1   -6
D1 1   -5
D2 2   -7
D1 3   -8
D2 3   -9

然后调用unstack将索引级别移动到列级别:

In [46]: result = result.unstack('S1'); result
Out[46]: 
    S2          
S1   0  1   2  3
D1  -4 -5 NaN -8
D2 NaN -6  -7 -9

全部放在一起,

import pandas as pd
df = pd.DataFrame({('D1', 'S1'): [0, 1, 3],
 ('D1', 'S2'): [-4, -5, -8],
 ('D2', 'S1'): [1, 2, 3],
 ('D2', 'S2'): [-6, -7, -9]})

result = df.stack(level=0)
result.index = result.index.droplevel(0)
result = result.set_index('S1', append=True)
result = result.unstack('S1')
result.columns = result.columns.droplevel(0)
print(result)

产量

S1   0  1   2  3
D1  -4 -5 NaN -8
D2 NaN -6  -7 -9

供参考:四个基本的DataFrame重塑操作是

它们是基础,因为DataFrame只是一个带索引和列的数组 水平。这些运算符允许您将值从数组移动到索引级别 到列级别和返回。以各种方式组合这4个操作即可 解决了很多DataFrame重塑问题。