使用多级索引转换熊猫数据透视表

时间:2018-12-21 12:57:44

标签: pandas dataframe pivot

我有一个具有以下索引的数据透视表(mypivot.index的输出):

MultiIndex(levels=[[u'DATASET1', u'DATASET2', u'DATASET3'], [3, 6], [u'ALGO1', u'ALGO2', u'ALGO3']],
       labels=[[0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2], [0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1], [0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 0, 1, 2, 0]],
       names=[u'DATASET', u'FINAL_TIME', u'POLICY'])

mypivot.columns返回时

Index([u'C', u'T1', u'T10', u'T2', u'T3', u'T6'], dtype='object')

这很难读,我想通过以下方式重塑它:

行索引级别:DATASET,FINAL_TIME

列索引级别:政策,处理方法(目前似乎没有名称)

我已经尝试了几种方法,主要是尝试将mypivot用作另一个数据透视表的输入,但是到目前为止还没有奏效。

1 个答案:

答案 0 :(得分:0)

使用:

np.random.seed(123)

mux = pd.MultiIndex(levels=[[u'DATASET1', u'DATASET2', u'DATASET3'], [3, 6], [u'ALGO1', u'ALGO2', u'ALGO3']],
       labels=[[0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2], [0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1], [0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 0, 1, 2, 0]],
       names=[u'DATASET', u'FINAL_TIME', u'POLICY'])

idx = pd.Index([u'C', u'T1', u'T10', u'T2', u'T3', u'T6'], dtype='object')

mypivot = pd.DataFrame(np.random.randint(10, size=(6,14)), index=idx, columns=mux)
print (mypivot)
DATASET    DATASET1                                ...  DATASET2        \
FINAL_TIME        3                 6              ...         3     6   
POLICY        ALGO1 ALGO2 ALGO3 ALGO1 ALGO2 ALGO3  ...     ALGO3 ALGO1   
C                 2     2     6     1     3     9  ...         0     1   
T1                3     4     0     0     4     1  ...         2     4   
T10               0     7     9     3     4     6  ...         6     2   
T2                0     2     6     2     4     4  ...         0     6   
T3                1     5     7     9     2     4  ...         2     1   
T6                0     8     1     6     3     3  ...         7     9   

DATASET    DATASET3                    
FINAL_TIME        3                 6  
POLICY        ALGO1 ALGO2 ALGO3 ALGO1  
C                 9     0     0     9  
T1                7     2     4     8  
T10               1     8     3     5  
T2                4     7     6     7  
T3                1     3     5     9  
T6                2     3     3     3  

[6 rows x 14 columns]

df = mypivot.stack().swaplevel(0,1).sort_index().T
print (df)
POLICY              ALGO1                          ...  ALGO3                 \
                        C   T1  T10   T2   T3   T6 ...      C   T1  T10   T2   
DATASET  FINAL_TIME                                ...                         
DATASET1 3            2.0  3.0  0.0  0.0  1.0  0.0 ...    6.0  0.0  9.0  6.0   
         6            1.0  0.0  3.0  2.0  9.0  6.0 ...    9.0  1.0  6.0  4.0   
DATASET2 3            6.0  7.0  1.0  6.0  8.0  5.0 ...    0.0  2.0  6.0  0.0   
         6            1.0  4.0  2.0  6.0  1.0  9.0 ...    NaN  NaN  NaN  NaN   
DATASET3 3            9.0  7.0  1.0  4.0  1.0  2.0 ...    0.0  4.0  3.0  6.0   
         6            9.0  8.0  5.0  7.0  9.0  3.0 ...    NaN  NaN  NaN  NaN   

POLICY                         
                      T3   T6  
DATASET  FINAL_TIME            
DATASET1 3           7.0  1.0  
         6           4.0  3.0  
DATASET2 3           2.0  7.0  
         6           NaN  NaN  
DATASET3 3           5.0  3.0  
         6           NaN  NaN  

[6 rows x 18 columns]

详细信息

使用stack进行重塑:

print (mypivot.stack())
DATASET    DATASET1    DATASET2      DATASET3     
FINAL_TIME        3  6        3    6        3    6
    POLICY                                        
C   ALGO1         2  1        6  1.0        9  9.0
    ALGO2         2  3        1  NaN        0  NaN
    ALGO3         6  9        0  NaN        0  NaN
T1  ALGO1         3  0        7  4.0        7  8.0
    ALGO2         4  4        3  NaN        2  NaN
    ALGO3         0  1        2  NaN        4  NaN
T10 ALGO1         0  3        1  2.0        1  5.0
    ALGO2         7  4        5  NaN        8  NaN
    ALGO3         9  6        6  NaN        3  NaN
T2  ALGO1         0  2        6  6.0        4  7.0
    ALGO2         2  4        3  NaN        7  NaN
    ALGO3         6  4        0  NaN        6  NaN
T3  ALGO1         1  9        8  1.0        1  9.0
    ALGO2         5  2        1  NaN        3  NaN
    ALGO3         7  4        2  NaN        5  NaN
T6  ALGO1         0  6        5  9.0        2  3.0
    ALGO2         8  3        9  NaN        3  NaN
    ALGO3         1  3        7  NaN        3  NaN

...然后在索引MultiIndex中的swaplevel

print (mypivot.stack().swaplevel(0,1))
DATASET    DATASET1    DATASET2      DATASET3     
FINAL_TIME        3  6        3    6        3    6
POLICY                                            
ALGO1  C          2  1        6  1.0        9  9.0
ALGO2  C          2  3        1  NaN        0  NaN
ALGO3  C          6  9        0  NaN        0  NaN
ALGO1  T1         3  0        7  4.0        7  8.0
ALGO2  T1         4  4        3  NaN        2  NaN
ALGO3  T1         0  1        2  NaN        4  NaN
ALGO1  T10        0  3        1  2.0        1  5.0
ALGO2  T10        7  4        5  NaN        8  NaN
ALGO3  T10        9  6        6  NaN        3  NaN
ALGO1  T2         0  2        6  6.0        4  7.0
ALGO2  T2         2  4        3  NaN        7  NaN
ALGO3  T2         6  4        0  NaN        6  NaN
ALGO1  T3         1  9        8  1.0        1  9.0
ALGO2  T3         5  2        1  NaN        3  NaN
ALGO3  T3         7  4        2  NaN        5  NaN
ALGO1  T6         0  6        5  9.0        2  3.0
ALGO2  T6         8  3        9  NaN        3  NaN
ALGO3  T6         1  3        7  NaN        3  NaN

...按sort_index排序:

print (mypivot.stack().swaplevel(0,1).sort_index())
DATASET    DATASET1    DATASET2      DATASET3     
FINAL_TIME        3  6        3    6        3    6
POLICY                                            
ALGO1  C          2  1        6  1.0        9  9.0
       T1         3  0        7  4.0        7  8.0
       T10        0  3        1  2.0        1  5.0
       T2         0  2        6  6.0        4  7.0
       T3         1  9        8  1.0        1  9.0
       T6         0  6        5  9.0        2  3.0
ALGO2  C          2  3        1  NaN        0  NaN
       T1         4  4        3  NaN        2  NaN
       T10        7  4        5  NaN        8  NaN
       T2         2  4        3  NaN        7  NaN
       T3         5  2        1  NaN        3  NaN
       T6         8  3        9  NaN        3  NaN
ALGO3  C          6  9        0  NaN        0  NaN
       T1         0  1        2  NaN        4  NaN
       T10        9  6        6  NaN        3  NaN
       T2         6  4        0  NaN        6  NaN
       T3         7  4        2  NaN        5  NaN
       T6         1  3        7  NaN        3  NaN

最后由T转置:

print (mypivot.stack().swaplevel(0,1).sort_index().T)
POLICY              ALGO1                          ...  ALGO3                 \
                        C   T1  T10   T2   T3   T6 ...      C   T1  T10   T2   
DATASET  FINAL_TIME                                ...                         
DATASET1 3            2.0  3.0  0.0  0.0  1.0  0.0 ...    6.0  0.0  9.0  6.0   
         6            1.0  0.0  3.0  2.0  9.0  6.0 ...    9.0  1.0  6.0  4.0   
DATASET2 3            6.0  7.0  1.0  6.0  8.0  5.0 ...    0.0  2.0  6.0  0.0   
         6            1.0  4.0  2.0  6.0  1.0  9.0 ...    NaN  NaN  NaN  NaN   
DATASET3 3            9.0  7.0  1.0  4.0  1.0  2.0 ...    0.0  4.0  3.0  6.0   
         6            9.0  8.0  5.0  7.0  9.0  3.0 ...    NaN  NaN  NaN  NaN   

POLICY                         
                      T3   T6  
DATASET  FINAL_TIME            
DATASET1 3           7.0  1.0  
         6           4.0  3.0  
DATASET2 3           2.0  7.0  
         6           NaN  NaN  
DATASET3 3           5.0  3.0  
         6           NaN  NaN  

[6 rows x 18 columns]
相关问题