如何转换包含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发布于 2019-11-06 16:16:33
主要思想是使用带有DataFrame.reset_index的DataFrame.stack将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如果排序很重要,则使用DataFrame.pop重新分配用于自动收报机、排序和列到最后一个位置的ordered catagorical
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 AAPLhttps://stackoverflow.com/questions/58725674
复制相似问题