向 MultiIndex DataFrame 添加新的嵌套级别值

Fer*_*ola 2 python multi-index pandas

如何将另一个级别值添加到初始化为特定值(例如无)的多重索引。很难用语言描述,最好用图形来描述,如何增加new价值水平:

df_before
          a   b   c   d
l1  l2                 
bar one  24  13   8   9
    two  11  30   7  23
baz one  21  31  12  30
    two   2   5  19  24
foo one  15  18   3  16
    two   2  24  28  11
qux one  23   9   6  12
    two  29  28  11  21

df_after
             a   b   c   d
l1  l2                 
bar one     24  13   8   9
    two     11  30   7  23
    new     None  None   None  None
baz one     21  31  12  30
    two     2   5  19  24
    new     None  None   None  None
foo one     15  18   3  16
    two     2  24  28  11
    new     None  None   None  None
qux one     23   9   6  12
    two     29  28  11  21
    new     None  None   None  None

Run Code Online (Sandbox Code Playgroud)

注意:我的 DataFrame 确实有三个级别,因此可以推广到更多级别的解决方案将不胜感激。我最好的尝试是获取旧级别的唯一值,附加新值并设置新级别,但它没有产生我想要的结果

# this is a failed attempt of what I wanted to do
new_level_values = [*list(df.index.get_level_values(2).unique()), "new"]
df.index = df.index.set_levels(levels=new_level_values, level=2)
df
Run Code Online (Sandbox Code Playgroud)

jez*_*ael 6

DataFrame.reindex与将新值附加到第二级一起使用并MultiIndex通过以下方式重新创建MultiIndex.from_product

v = [*list(df.index.levels[1]), "new"]

df = df.reindex(pd.MultiIndex.from_product([df.index.levels[0],v]))
print (df)
            a     b     c     d
l1                             
bar one  24.0  13.0   8.0   9.0
    two  11.0  30.0   7.0  23.0
    new   NaN   NaN   NaN   NaN
baz one  21.0  31.0  12.0  30.0
    two   2.0   5.0  19.0  24.0
    new   NaN   NaN   NaN   NaN
foo one  15.0  18.0   3.0  16.0
    two   2.0  24.0  28.0  11.0
    new   NaN   NaN   NaN   NaN
qux one  23.0   9.0   6.0  12.0
    two  29.0  28.0  11.0  21.0
    new   NaN   NaN   NaN   NaN
Run Code Online (Sandbox Code Playgroud)