Конвертировать многоиндексные столбцы в стандартные столбцы - PullRequest
3 голосов
/ 06 ноября 2019

Как мы можем преобразовать DataFrame Panads, содержащий столбец MultiIndex, такой как

                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 Ответ

3 голосов
/ 06 ноября 2019

Основная идея - использовать DataFrame.stack с DataFrame.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 s для тикеров, сортировки и переназначения столбца на последнюю позицию с помощью 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
...