Python Pandas - 如何将具有两个值的透视表取消堆叠并将每个值转为新列?
在对一个包含两个值的数据表进行透视操作后,结果如下:
import pandas as pd
df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar',
'foo', 'bar', 'foo', 'bar'],
'B' : ['one', 'one', 'two', 'two',
'two', 'two', 'one', 'two'],
'C' : [56, 2, 3, 4, 5, 6, 0, 2],
'D' : [51, 2, 3, 4, 5, 6, 0, 2]})
pd.pivot_table(df, values=['C','D'],rows='B',cols='A').unstack().reset_index()
当我把这个透视的数据表展开,并重置索引时,会出现两个新列,分别叫做 'level_0' 和 0。'level_0' 列里包含了列名 C 和 D,而 0 列里则是对应的数值。
level_0 A B 0
0 C bar one 2.0
1 C bar two 4.0
2 C foo one 28.0
3 C foo two 4.0
4 D bar one 2.0
5 D bar two 4.0
6 D foo one 25.5
7 D foo two 4.0
我能否将这个数据表展开,使得每个值(C,D)出现在单独的列中,还是说我必须先拆分再合并这个数据表才能实现呢?谢谢。
编辑后显示想要的输出:
A B C D
0 bar one 2 2
1 bar two 4 4
2 foo one 28 25.5
3 foo two 4 4
1 个回答
4
你想要的是stack
(而不是unstack):
In [70]: pd.pivot_table(df, values=['C','D'],rows='B',cols='A').stack()
Out[70]:
C D
B A
one bar 2 2.0
foo 28 25.5
two bar 4 4.0
foo 4 4.0
虽然你使用的unstack
操作实际上也做了“堆叠”,因为你的索引轴上没有多重索引(只有在列轴上有)。
但实际上,你也可以通过分组操作来实现这个效果,我觉得这样更合理,因为你实际上是在按A和B分组列C和D:
In [72]: df.groupby(['A', 'B']).mean()
Out[72]:
C D
A B
bar one 2 2.0
two 4 4.0
foo one 28 25.5
two 4 4.0