将级别附加到 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的主要内容,如果未能解决你的问题,请参考以下文章

将字符串拆分附加到 Pandas DataFrame [关闭]

使用 pandas 根据条件将 csv 值附加到列表

尝试使用 pandas 数据框将数据附加到 BigQuery 表时出错

python - 如何将 numpy 数组附加到 pandas 数据帧

将提取的列附加到没有索引的列表中:Pandas

将 pandas DataFrame 列附加到 CSV