【问题标题】:Pandas - Add a column level to multi indexPandas - 向多索引添加列级别
【发布时间】:2019-11-07 18:32:27
【问题描述】:

我想根据值列表在我的数据框中添加一个子级别 (L4):

x = [0.01, 0.01, 0.01, 0.02, 0.02, 0.02]

df.columns 向我返回这个:

MultiIndex(levels=[['Foo', 'Bar'], ['A', 'B', 'C'], ['a']],
           labels=[[0, 0, 0, 1, 1, 1], [0, 1, 2, 0, 1, 2], [0, 0, 0, 0, 0, 0]],
           names=['L1', 'L2', 'L3'])

到目前为止,我已经尝试过:

df = pd.concat([df], keys=x, names=['L4'], axis=1).swaplevel(i='L4', j='L1', axis=1).swaplevel(i='L4', j='L2', axis=1).swaplevel(i='L4', j='L3', axis=1)

但它没有给出好的价值,它重复 list_levels[0] (0.01)。

你知道我该怎么做吗?

谢谢

【问题讨论】:

    标签: python pandas multi-index


    【解决方案1】:

    这是一种方法:

    cols = pd.MultiIndex(levels=[['Foo', 'Bar'], ['A', 'B', 'C'], ['a']],
           labels=[[0, 0, 0, 1, 1, 1], [0, 1, 2, 0, 1, 2], [0, 0, 0, 0, 0, 0]],
           names=['L1', 'L2', 'L3'])
    
    pd.DataFrame(columns = cols).T\
      .assign(x = [0.01, 0.01, 0.01, 0.02, 0.02, 0.02])\
      .set_index('x', append=True).T
    

    输出:

    【讨论】:

      【解决方案2】:

      您可以创建一个DataFrame,将列索引作为索引,data 是您要添加的级别,因为set_index(append=True) 仅针对行索引定义。然后用df.columns = ...分配它

      import pandas as pd
      
      idx = pd.MultiIndex(levels=[['Foo', 'Bar'], ['A', 'B', 'C'], ['a']],
                      codes=[[0, 0, 0, 1, 1, 1], [0, 1, 2, 0, 1, 2], [0, 0, 0, 0, 0, 0]],
                      names=['L1', 'L2', 'L3'])
      x = [0.01, 0.01, 0.01, 0.02, 0.02, 0.02]
      
      pd.DataFrame(x, index=idx, columns=['L4']).set_index('L4', append=True).index
      #MultiIndex([('Foo', 'A', 'a', 0.01),
      #            ('Foo', 'B', 'a', 0.01),
      #            ('Foo', 'C', 'a', 0.01),
      #            ('Bar', 'A', 'a', 0.02),
      #            ('Bar', 'B', 'a', 0.02),
      #            ('Bar', 'C', 'a', 0.02)],
      #           names=['L1', 'L2', 'L3', 'L4'])
      

      在幕后set_index 只是在追加时重新创建整个 MultiIndex,因此更实际的方法是

      arrays = []
      for i in range(idx.nlevels):
          arrays.append(idx.get_level_values(i))
      
      arrays.append(pd.Index(x, name='L4'))  # Add the new level
      
      new_idx = pd.MultiIndex.from_arrays(arrays)
      #MultiIndex([('Foo', 'A', 'a', 0.01),
      #            ('Foo', 'B', 'a', 0.01),
      #            ('Foo', 'C', 'a', 0.01),
      #            ('Bar', 'A', 'a', 0.02),
      #            ('Bar', 'B', 'a', 0.02),
      #            ('Bar', 'C', 'a', 0.02)],
      #           names=['L1', 'L2', 'L3', 'L4'])
      

      【讨论】:

        猜你喜欢
        • 2018-06-10
        • 2021-10-15
        • 2020-03-12
        • 2017-10-06
        • 1970-01-01
        • 2016-09-17
        • 1970-01-01
        • 2013-04-11
        • 2016-12-27
        相关资源
        最近更新 更多