将级别附加到 pandas MultiIndex

Posted

技术标签:

【中文标题】将级别附加到 pandas MultiIndex【英文标题】:Append a level to a pandas MultiIndex 【发布时间】:2018-11-09 13:46:40 【问题描述】:

假设我有一个带有三个索引“a”、“b”和“c”的 pandas 数据框 - 如何从数组中添加第四个索引并将其名称同时设置为“d”?

这行得通:

df.set_index(fourth_index, append=True, inplace=True)
df.index.set_names(['a','b','c','d'], inplace=True)

但我正在寻找不需要我再次命名前三个索引的东西,例如(这不起作用):

df.set_index('d': fourth_index, append=True, inplace=True)

我在这里缺少一些功能吗?

【问题讨论】:

【参考方案1】:

fourth_index 添加为列,然后调用set_index。名称被保留。

df = df.assign(d=fourth_index).set_index('d', append=True)

请注意,如果您担心内存问题,那么您所做的一切都很好。为了更少的字符而牺牲性能是没有意义的。


演示

df
          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.assign(l3=1).set_index('l3', append=True)

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

【讨论】:

谢谢!不担心性能 - 更担心我需要在多个位置控制其他三列的名称这一事实,我想保持它们原样而不是重新定义它们以与以前相同:-)【参考方案2】:

为什么不直接保存之前值的名称,即

old_names = df.index.names
df.set_index(fourth_index, append=True, inplace=True)
df.index.set_names(old_names + ['d'], inplace=True)

这样可以保持良好性能的好处,并且不需要您重新输入旧名称。

【讨论】:

【参考方案3】:

set_names 支持特定于关卡的(重新)命名

df.set_index(fourth_index, append=True, inplace=True)
df.index.set_names('d', level=df.index.nlevels-1, inplace=True)

也可以在一行中不用inplace:

df.index = df.set_index(fourth_index, append=True).index.set_names('d', level=df.index.nlevels)

【讨论】:

以上是关于将级别附加到 pandas MultiIndex的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 go.uber.org/zap lib 以不同的日志级别打印不同的颜色,并根据日志级别将日志附加到不同的文件?

无涯教程:Nginx - 静态内容介绍

将具有看不见的字符串值的新记录附加到数据框时,看不见的因子级别会导致警告并导致 NA

Log4Net 将两个不同级别的日志记录到同一记录器的两个不同附加程序

具有 3 个级别的 MongoDB 嵌套查找并将新值附加到结果文档

Nginx 重定向到另一个域并附加新参数