如何解决熊猫枢轴索引级别3并随列而变化
我需要解决一个问题:
我有一个像这样的数据框:
a b c
0 0 40 1.0 2.0 3.0
50 4.0 5.0 6.0
1 40 7.0 8.0 9.0
50 10.0 11.0 12.0
1 0 40 13.0 14.0 15.0
50 16.0 17.0 18.0
1 40 19.0 20.0 21.0
50 22.0 23.0 24.0
现在,我做了一些转换(其中一些是必要的),而我得到了类似的东西
a b c
(0,40) 1.0 2.0 3.0
(0,50) 4.0 5.0 6.0
(0,1,40) 7.0 8.0 9.0
(0,50) 10.0 11.0 12.0
(1,40) 13.0 14.0 15.0
(1,50) 16.0 17.0 18.0
(1,40) 19.0 20.0 21.0
(1,50) 22.0 23.0 24.0
''' 而且我想旋转最后一个索引(40或50)并更改为列,类似:
40 50
0 0 a 1.0 4.0
b 2.0 5.0
c 3.0 6.0
1 a 7.0 10.0
b 8.0 11.0
c 9.0 12.0
1 0 a 13.0 16.0
b 14.0 17.0
c 15.0 18.0
1 a 19.0 22.0
b 20.0 23.0
c 21.0 24.0
或以元组形式作为索引,例如:
(0,a) 1.0 4.0
(0,b) 2.0 5.0
(0,c) 3.0 6.0
(0,a) 7.0 10.0
(0,b) 8.0 11.0
(0,c) 9.0 12.0
and so on
感谢大家的回答。
解决方法
处理用tuple
填充的索引是有问题的,需要MulitIndex
。
#input data
print (df)
a b c
(0,40) 1.0 2.0 3.0
(0,50) 4.0 5.0 6.0
(0,1,40) 7.0 8.0 9.0
(0,50) 10.0 11.0 12.0
(1,40) 13.0 14.0 15.0
(1,50) 16.0 17.0 18.0
(1,40) 19.0 20.0 21.0
(1,50) 22.0 23.0 24.0
首先通过MultiIndex.from_tuples
将元组中的值转换为MultiIndex
:
df.index = pd.MultiIndex.from_tuples(df.index)
print (df)
a b c
0 0 40 1.0 2.0 3.0
50 4.0 5.0 6.0
1 40 7.0 8.0 9.0
50 10.0 11.0 12.0
1 0 40 13.0 14.0 15.0
50 16.0 17.0 18.0
1 40 19.0 20.0 21.0
50 22.0 23.0 24.0
然后DataFrame.stack
和Series.unstack
:
df = df.stack().unstack(level=2)
print (df)
40 50
0 0 a 1.0 4.0
b 2.0 5.0
c 3.0 6.0
1 a 7.0 10.0
b 8.0 11.0
c 9.0 12.0
1 0 a 13.0 16.0
b 14.0 17.0
c 15.0 18.0
1 a 19.0 22.0
b 20.0 23.0
c 21.0 24.0
最后在必要时切换回元组:
df.index = df.index.map(tuple).tolist()
print (df)
40 50
(0,a) 1.0 4.0
(0,b) 2.0 5.0
(0,c) 3.0 6.0
(0,a) 7.0 10.0
(0,b) 8.0 11.0
(0,c) 9.0 12.0
(1,a) 13.0 16.0
(1,b) 14.0 17.0
(1,c) 15.0 18.0
(1,a) 19.0 22.0
(1,b) 20.0 23.0
(1,c) 21.0 24.0
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。