将MultiIndex列转换为标准列

时间:2019-11-06 08:14:06

标签: python python-3.x pandas multi-index

我们如何转换包含MultiIndex列的Pandas DataFrame,例如

                FB                  AAPL
                open    volume      open    volume
date
2019-10-30      189.56  28734995    244.76  31130522
2019-10-31      196.70  42286529    247.24  34790520
2019-11-01      192.85  21711829    249.54  37781334

到具有常规列的索引,其中索引级别之一现在是所有行中的一列

                open    volume      ticker  
date
2019-10-30      189.56  28734995    FB      
2019-10-31      196.70  42286529    FB      
2019-11-01      192.85  21711829    FB      
2019-10-30      244.76  31130522    AAPL
2019-10-31      247.24  34790520    AAPL
2019-11-01      249.54  37781334    AAPL

1 个答案:

答案 0 :(得分:4)

主要思想是将DataFrame.stackDataFrame.reset_index结合使用,将MultiIndex第二级转换为列:

df = df.stack(0).rename_axis(('date','ticker')).reset_index(level=1)
print (df)
           ticker    open    volume
date                               
2019-10-30   AAPL  244.76  31130522
2019-10-30     FB  189.56  28734995
2019-10-31   AAPL  247.24  34790520
2019-10-31     FB  196.70  42286529
2019-11-01   AAPL  249.54  37781334
2019-11-01     FB  192.85  21711829

如果排序很重要,则将ordered catagorical用于代码,排序和将列至最后位置的DataFrame.pop重新分配:

df1 = df.stack(0).rename_axis(('date','ticker')).reset_index(level=1)
df1['ticker'] = pd.Categorical(df1.pop('ticker'), 
                               ordered=True, 
                               categories=df.columns.get_level_values(0).unique())
df1 = df1.sort_values(['ticker','date'])
print (df1)
              open    volume ticker
date                               
2019-10-30  189.56  28734995     FB
2019-10-31  196.70  42286529     FB
2019-11-01  192.85  21711829     FB
2019-10-30  244.76  31130522   AAPL
2019-10-31  247.24  34790520   AAPL
2019-11-01  249.54  37781334   AAPL