【问题标题】:Append a level to a pandas MultiIndex将级别附加到 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)

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

【问题讨论】:

    标签: python pandas indexing multi-index


    【解决方案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)
      

      【讨论】:

        猜你喜欢
        • 2018-12-20
        • 2019-02-16
        • 2013-01-22
        • 2020-02-14
        • 1970-01-01
        • 2020-09-16
        • 1970-01-01
        • 2019-02-28
        • 2017-04-19
        相关资源
        最近更新 更多