代码之家  ›  专栏  ›  技术社区  ›  Kang

熊猫多索引数据帧中按级别对列求和

  •  13
  • Kang  · 技术社区  · 7 年前

    我的df有多个索引列。我的所有值都是浮点数,我想将值与多索引的第一级中的值合并。详情请参见下文。

    first        bar                 baz                 foo   
    second       one       two       one       two       one    
    A       0.895717  0.805244  1.206412  2.565646  1.431256    
    B       0.410835  0.813850  0.132003  0.827317  0.076467    
    C       1.413681  1.607920  1.024180  0.569605  0.875906 
    
    first        bar                 baz                 foo   
    
    A       (0.895717+0.805244) (1.206412+2.565646)  1.431256    
    B       (0.410835+0.813850) (0.132003+0.827317)  0.076467    
    C       (1.413681+1.607920) (1.024180+0.569605)  0.875906 
    

    这些值实际上是添加的(我只是不想做这些:))。归根结底,我只想升级(我猜是更高的级别),并在索引中添加所有值。请告诉我一个好方法。非常感谢。

    2 回复  |  直到 4 年前
        1
  •  22
  •   cs95 abhishek58g    7 年前

    我相信你在找一个 groupby 沿着第一个轴。

    df.groupby(level=0, axis=1).sum()
    

    或者(更简洁地说),

    df.sum(level=0, axis=1)
    

    这个 level 参数到 sum 表示分组。


    df
    
    first  bar     baz     foo    
    second one two one two one two
    A        2   3   3   4  10   8
    B       22  16   7   3   2  26
    C        4   5   1   9   6   5
    
    df.sum(level=0, axis=1)
    
    first  bar  baz  foo
    A        5    7   18
    B       38   10   28
    C        9   10   11
    

    就性能而言,上面概述的两种方法几乎没有什么区别(后者快了几步)。

        2
  •  6
  •   Austin Mackillop    6 年前

    请记住 df.sum(level, axis) 仅当您将列设置为多索引时,才有效。实例

    D = {'one': range(6), 
         'two': range(1,7), 
         'CAT1': 'A A A A A A'.split(), 
         'CAT2': 'B B B C C C'.split(), 
         'CAT3': 'D D E E F F'.split()}
    
    df = pd.DataFrame(D)
    df = df.set_index('CAT1 CAT2 CAT3'.split())
    df
                    one  two
    CAT1 CAT2 CAT3          
    A    B    D       0    1
              D       1    2
              E       2    3
         C    E       3    4
              F       4    5
              F       5    6
    

    如果您的数据在此表单中,则必须使用 df.groupby(level=n).sum(axis=1)

    df.groupby(level = 0).sum(axis=1)
    
          one  two
    CAT1          
    A      15   21
    
    df.groupby(level = 1).sum(axis=1)
    
          one  two
    CAT2          
    B       3    6
    C      12   15
    
    df.groupby(level = 2).sum(axis=1)
    
          one  two
    CAT3          
    D       1    3
    E       5    7
    F       9   11
    

    如果您尝试跳过 groupby ,

    df.sum(level = 1, axis=1)
    
    ValueError: level > 0 or level < -1 only valid with  MultiIndex
    

    这是一个有趣的错误,

    df.index
    
    MultiIndex(levels=[[u'A'], [u'B', u'C'], [u'D', u'E', u'F']],
               labels=[[0, 0, 0, 0, 0, 0], [0, 0, 0, 1, 1, 1], [0, 0, 1, 1, 2, 2]],
               names=[u'CAT1', u'CAT2', u'CAT3'])