假设我有以下数据帧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)有没有简单的方法来执行此扩展?
假设L2最初包含您需要的所有可能值,您可以使用unstack.stack技巧:
df.unstack('L2', fill_value=0).stack(level=1)
Run Code Online (Sandbox Code Playgroud)