如何用Pandas重新排列索引级别?

时间:2016-07-12 13:28:46

标签: python pandas

这篇文章的目的是试图了解如何最好地操作多级数据帧。

创建数据框

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

1 个答案:

答案 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