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

多索引pandas数据帧中的行求和

  •  2
  • Mike  · 技术社区  · 6 年前

                 A         B
    year  age  
    1895   0     10        12
    1895   1     13        14
    ...
    1965   0     34        45
    1965   1     41        34
          ...
    1965  50     56        22
    1966   0     10        34
    ...
    

    我想把A列(和B列)中两个值(例如10到20)之间的所有年龄相加。我和.xs玩了一会儿。

    pops.xs(20, level='age')
    

    每年都有20岁的孩子,但我不能在多个年龄段(和总和)得到这个。

    对于0和1我想得到

    有什么建议可以用一种优雅(有效)的方法来做到这一点吗?

              A         B
    year    
    1895      23        26
    ...
    1965      75        79
    ...
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   jezrael    6 年前

    使用 query 用于选择 sum 每一级 year S:

    print (df)
               A   B
    year age        
    1895 8    10  12
         12   13  14
    1965 0    34  45
         14   41  34
         12   56  22
    1966 0    10  34
    
    df = df.query('10 <= age <= 20').sum(level=0)
    print (df)
           A   B
    year        
    1895  13  14
    1965  97  56
    

    细节 :

    print (df.query('10 <= age <= 20'))
               A   B
    year age        
    1895 12   13  14
    1965 14   41  34
         12   56  22
    

    另一个解决方案是使用 Index.get_level_values 对于 index 然后过滤 boolean indexing :

    i = df.index.get_level_values('age')
    print (i)
    Int64Index([8, 12, 0, 14, 12, 0], dtype='int64', name='age')
    
    df = df[(i >= 10) & (i <= 20)].sum(level=0)
    print (df)
           A   B
    year        
    1895  13  14
    1965  97  56
    
        2
  •  0
  •   Ben.T    6 年前

    你可以用 loc slice 要选择所需的df部分,例如:

    df.loc[(slice(None),slice(10,20)),:].sum(level=0)
    

    哪里 (slice(None),slice(10,20)) 允许您保留所有年龄在10到20岁之间的所有索引