Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在多索引数据帧中按级别对列求和_Python_Pandas_Dataframe_Multi Index - Fatal编程技术网

Python 在多索引数据帧中按级别对列求和

Python 在多索引数据帧中按级别对列求和,python,pandas,dataframe,multi-index,Python,Pandas,Dataframe,Multi Index,我的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.813

我的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 

这些值实际上是被添加的(我只是不想做这些:))。底线是我只想升级(我猜是更高的级别),然后在索引中添加所有值。请让我知道这样做的好方法。谢谢大家!

我相信您正在沿着第一个轴寻找一个
groupby

df.groupby(level=0, axis=1).sum()
或者(更简洁地说)

sum
level
参数意味着分组



就性能而言,上述两种方法之间几乎没有什么区别(后者快了几个刻度)。

请记住,
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)

如果您尝试跳过
groupby

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

ValueError: level > 0 or level < -1 only valid with  MultiIndex

df.sum(axis=1,level='first')
也适用于OP案例,索引级别0有一个名称。@mins利用命名索引,这是一个很好的调用。谢谢
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 = 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
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'])