从列级别的索引交换第一级(Pandas Multiindex Dataframe)

时间:2016-02-16 21:14:41

标签: python pandas

我有一个多索引的pandas.Dataframe,它是这样的:

          BAZ    PAL
Foo  Bar          
124   1    A     B
      2    C     D
134   1    E     F
      2    G     H

我需要以适当的方式将index中的level-one与列交换。我需要最终得到这样的东西:

         124 134
Coo Bar
BAZ 1    A   E
    2    C   G
PAL 1    B   F
    2    D   H

1 个答案:

答案 0 :(得分:2)

您需要将现有索引级别Foo取消堆叠,堆叠所需的列' Coo',然后重新排列索引级别。交换索引级别后,您可能希望对其进行排序。最后,您可能希望删除所有值的列名(val)。

df = (pd.DataFrame({'Foo': [124, 124, 134, 134] * 2, 
                    'Bar': [1, 2, 1, 2] * 2, 
                    'Coo': ['BAZ'] * 4 + ['PAL'] * 4, 
                    'val': list('ACEGBDFH')})
      .set_index(['Foo', 'Bar', 'Coo'])
      .unstack('Coo'))

>>> df
        val    
Coo     BAZ PAL
Foo Bar        
124 1     A   B
    2     C   D
134 1     E   F
    2     G   H

df = df.unstack('Foo').stack('Coo')
df.index = df.index.swaplevel(0, 1)

>>> df
        val    
Foo     124 134
Coo Bar        
BAZ 1     A   E
PAL 1     B   F
BAZ 2     C   G
PAL 2     D   H

df.sort_index(inplace=True)

>>> df
        val    
Foo     124 134
Coo Bar        
BAZ 1     A   E
    2     C   G
PAL 1     B   F
    2     D   H

df.columns = df.columns.droplevel()

>>> df
Foo     124 134
Coo Bar        
BAZ 1     A   E
    2     C   G
PAL 1     B   F
    2     D   H