将多重索引列转换为标准列

3
我们如何转换一个包含多级索引列的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

将具有常规列的DataFrame转换为其中一个索引级别现在成为所有行中的列

                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个回答

5
主要思想是使用DataFrame.stackDataFrame.reset_index将多级索引的第二层转换为列:
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

如果顺序很重要,则使用“有序分类”来对股票代码进行排序,并使用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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接