我正在尝试转换此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)
列中的值将成为唯一的数据值。
我怎样才能简单有效地实现这一目标?
答案 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重塑问题。