Python 对行进行多级索引

Python 对行进行多级索引,python,pandas,Python,Pandas,我正在尝试转换此数据帧: 例如: 本质上,列(D1,S1)和(D2,S1)中的值需要合并到列名中,列(D1,S2)和(D2,S2)中的值成为唯一的数据值 如何简单有效地实现这一点?所需的数据帧在索引中具有Ds堆栈将列级值移动到索引中。因此,考虑调用堆栈是很自然的: 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

我正在尝试转换此数据帧:

例如:

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


如何简单有效地实现这一点?

所需的数据帧在索引中具有
D
s<代码>堆栈将列级值移动到索引中。因此,考虑调用
堆栈是很自然的:

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
所需的数据帧在索引中只有
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

供参考:四种基本的数据帧重塑操作如下

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

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