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