【问题标题】:Transforming a pandas pivot table with multi-level index使用多级索引转换 pandas 数据透视表
【发布时间】:2018-12-21 22:24:52
【问题描述】:

我有一个带有以下索引的数据透视表(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

列索引级别:POLICY、TREATMENTS(目前似乎没有名称)

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

【问题讨论】:

    标签: pandas dataframe pivot


    【解决方案1】:

    用途:

    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
    

    ...然后swaplevel in MultiIndex in index

    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]
    

    【讨论】:

    • 对不起,也许我没有正确解释自己,但这基本上是我试图构建的内容的转置
    • @Gio - 哎呀,我忘了转置,答案已编辑。
    • 您显示的输出是正确的,但我只是收到一个错误:ValueError: No axis named 1 for object type
    • 好的,如果删除,rename_axis(('POLICY','TREATMENTS'), 1)会怎样?
    • 我已经尝试过了,但它不起作用。这是我得到的 df 的索引:pastebin.com/nP0pUe0z
    猜你喜欢
    • 2016-09-15
    • 2016-07-12
    • 1970-01-01
    • 2020-08-30
    • 2017-05-24
    • 2016-05-26
    • 1970-01-01
    • 2020-10-17
    • 2023-03-29
    相关资源
    最近更新 更多