这篇文章的目的是试图了解如何最好地操作多级数据帧。
创建数据框
import numpy as np
dates = pd.date_range('20130101', periods=6)
df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('WXYZ'))
df['Portfolio']= list('ABCDEF')
df
数据帧
Y Z Portfolio
01/01/2013 1 2 A
02/01/2013 3 4 B
03/01/2013 5 6 C
04/01/2013 7 8 D
05/01/2013 9 10 E
06/01/2013 11 12 F
转动数据框
dfs_pivot = df.pivot(columns='Portfolio')
dfs_pivot
透视日期框架
Y Z
Portfolio A B C D E F A B C D E F
2013-01-01 1 NaN NaN NaN NaN NaN 2 NaN NaN NaN NaN NaN
2013-01-02 NaN 3 NaN NaN NaN NaN NaN 4 NaN NaN NaN NaN
2013-01-03 NaN NaN 5 NaN NaN NaN NaN NaN 6 NaN NaN NaN
2013-01-04 NaN NaN NaN 7 NaN NaN NaN NaN NaN 8 NaN NaN
2013-01-05 NaN NaN NaN NaN 9 NaN NaN NaN NaN NaN 10 NaN
2013-01-06 NaN NaN NaN NaN NaN 11 NaN NaN NaN NaN NaN 12
如何切换级别?
Portfolio A B C D E F
Y Z Y Z Y Z Y Z Y Z Y Z
2013-01-01 1 2 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2013-01-02 NaN NaN 3 4 NaN NaN NaN NaN NaN NaN NaN NaN
2013-01-03 NaN NaN NaN NaN 5 6 NaN NaN NaN NaN NaN NaN
2013-01-04 NaN NaN NaN NaN NaN NaN 7 8 NaN NaN NaN NaN
2013-01-05 NaN NaN NaN NaN NaN NaN NaN NaN 9 10 NaN NaN
2013-01-06 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 11 12
答案 0 :(得分:4)
要交换MultiIndex级别的顺序,请使用DataFrame.swaplevel
:
import numpy as np
import pandas as pd
dates = pd.date_range('20130101', periods=6)
df = pd.DataFrame(np.random.randint(10, size=(6,2)), index=dates, columns=list('YZ'))
df['Portfolio']= list('ABCDEF')
dfs_pivot = df.pivot(columns='Portfolio').swaplevel(0, 1, axis=1)
产量
Portfolio A B C D E F A B C D E F
Y Y Y Y Y Y Z Z Z Z Z Z
2013-01-01 7.0 NaN NaN NaN NaN NaN 9.0 NaN NaN NaN NaN NaN
2013-01-02 NaN 4.0 NaN NaN NaN NaN NaN 3.0 NaN NaN NaN NaN
2013-01-03 NaN NaN 8.0 NaN NaN NaN NaN NaN 2.0 NaN NaN NaN
2013-01-04 NaN NaN NaN 5.0 NaN NaN NaN NaN NaN 7.0 NaN NaN
2013-01-05 NaN NaN NaN NaN 4.0 NaN NaN NaN NaN NaN 7.0 NaN
2013-01-06 NaN NaN NaN NaN NaN 3.0 NaN NaN NaN NaN NaN 9.0
要对列调用DataFrame.sortlevel
:
dfs_pivot = dfs_pivot.sortlevel(axis=1)
产量
Portfolio A B C D E F
Y Z Y Z Y Z Y Z Y Z Y Z
2013-01-01 7.0 9.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2013-01-02 NaN NaN 4.0 3.0 NaN NaN NaN NaN NaN NaN NaN NaN
2013-01-03 NaN NaN NaN NaN 8.0 2.0 NaN NaN NaN NaN NaN NaN
2013-01-04 NaN NaN NaN NaN NaN NaN 5.0 7.0 NaN NaN NaN NaN
2013-01-05 NaN NaN NaN NaN NaN NaN NaN NaN 4.0 7.0 NaN NaN
2013-01-06 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 3.0 9.0
要按自定义顺序重新排列列,您可以调用reindex
:
custom_order = [('E', 'Z'), ('D', 'Z'), ('C', 'Z'), ('F', 'Z'), ('F', 'Y'), ('B', 'Z'),
('C', 'Y'), ('E', 'Y'), ('A', 'Z'), ('A', 'Y'), ('B', 'Y'), ('D', 'Y')]
dfs_pivot = dfs_pivot.reindex(columns=custom_order)
或更简单地说,使用列索引语法:
dfs_pivot = dfs_pivot[custom_order]
产生
Portfolio E D C F B C E A B D
Z Z Z Z Y Z Y Y Z Y Y Y
2013-01-01 NaN NaN NaN NaN NaN NaN NaN NaN 9.0 7.0 NaN NaN
2013-01-02 NaN NaN NaN NaN NaN 3.0 NaN NaN NaN NaN 4.0 NaN
2013-01-03 NaN NaN 2.0 NaN NaN NaN 8.0 NaN NaN NaN NaN NaN
2013-01-04 NaN 7.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN 5.0
2013-01-05 7.0 NaN NaN NaN NaN NaN NaN 4.0 NaN NaN NaN NaN
2013-01-06 NaN NaN NaN 9.0 3.0 NaN NaN NaN NaN NaN NaN NaN