如何为一个多索引级别的所有缺失值添加行?

kjo*_*kjo 3 python pandas

假设我有以下数据帧df,由3级多索引索引:

In [52]: df
Out[52]: 
          C
L0 L1 L2   
0  w  P   1
   y  P   2
      R   3
1  x  Q   4
      R   5
   z  S   6
Run Code Online (Sandbox Code Playgroud)

用于创建DataFrame的代码:

idx = pd.MultiIndex(levels=[[0, 1], ['w', 'x', 'y', 'z'], ['P', 'Q', 'R', 'S']],
                    labels=[[0, 0, 0, 1, 1, 1], [0, 2, 2, 1, 1, 3], [0, 0, 2, 1, 2, 3]],
                    names=['L0', 'L1', 'L2'])

df = pd.DataFrame({'C': [1, 2, 3, 4, 5, 6]}, index=idx)
Run Code Online (Sandbox Code Playgroud)

对于可能的值L2水平为'P','Q','R',和'S',但一些值的缺失对于剩余的水平值的特定组合.例如,组合(L0=0, L1='w', L2='Q')不存在df.

我想添加足够的行,df以便对于除其他级别的每个值组合,L2每个L2级别的可能值只有一行.对于添加的行,C列的值应为0.

IOW,我想扩展df,看起来像这样:

          C
L0 L1 L2     
0  w  P   1
      Q   0
      R   0
      S   0
   y  P   2
      Q   0
      R   3
      S   0
1  x  P   0
      Q   4
      R   5
      S   0
   z  P   0
      Q   0
      R   0
      S   6
Run Code Online (Sandbox Code Playgroud)

要求:

  • 操作应保持列的类型不变;
  • 该操作应添加仅完成指定级别所需的最小行数(L2)

有没有简单的方法来执行此扩展?

Psi*_*dom 5

假设L2最初包含您需要的所有可能值,您可以使用unstack.stack技巧:

df.unstack('L2', fill_value=0).stack(level=1)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述