使用分层索引和来自非分层索引数据框的额外列创建数据框

Create dataframe with hierarchical indices and extra columns from non-hierarchically indexed dataframe

考虑一个简单的数据框:

import numpy as np
import pandas as pd

x = pd.DataFrame(np.arange(10).reshape(5,2))
print(x)
   0  1
0  0  1
1  2  3
2  4  5
3  6  7
4  8  9

我想创建一个层次索引数据框,格式如下:

     0         1
     a    b    a    b
0    0  NaN    1  NaN
1    2  NaN    3  NaN
2    4  NaN    5  NaN
3    6  NaN    7  NaN
4    8  NaN    9  NaN

其中 'a' 列对应于原始数据框列,而 'b' 列为空白(或 nan)。 我当然可以创建一个包含所有 NaN 的分层索引数据框并遍历原始数据框的列,将它们写入 新的数据框。还有比这更紧凑的吗?

你可以用 MultiIndex.from_product

extra_level = ['a', 'b']
new_cols = pd.MultiIndex.from_product([x.columns, extra_level])
x.columns = new_cols[::len(x.columns)] # select all the first element of extra_level
x = x.reindex(columns=new_cols)
print(x)
   0      1    
   a   b  a   b
0  0 NaN  1 NaN
1  2 NaN  3 NaN
2  4 NaN  5 NaN
3  6 NaN  7 NaN
4  8 NaN  9 NaN

非常像@Ben.T 我正在使用 MultiIndex.from_product:

x.assign(l='a')
 .set_index('l', append=True)
 .unstack()
 .reindex(pd.MultiIndex.from_product([x.columns.tolist(), ['a','b']]), axis=1)

输出:

   0      1    
   a   b  a   b
0  0 NaN  1 NaN
1  2 NaN  3 NaN
2  4 NaN  5 NaN
3  6 NaN  7 NaN
4  8 NaN  9 NaN