在多索引数据帧中的列之间进行数学运算的Pythonic方法,并将结果作为原始数据帧中的一个单独列进行处理

在多索引数据帧中的列之间进行数学运算的Pythonic方法,并将结果作为原始数据帧中的一个单独列进行处理,python,pandas,dataframe,Python,Pandas,Dataframe,我想弄清楚 cols = pd.MultiIndex.from_product([['Company A','Company B'],['VWAL','Volumn']],names=[u'Entity',u'Indicator']) rows = pd.date_range(start='2018-01-01',periods=6,freq='D') df = pd.DataFrame(np.random.random_integers(1,100,(6,4)),index=rows,colu

我想弄清楚

cols = pd.MultiIndex.from_product([['Company A','Company B'],['VWAL','Volumn']],names=[u'Entity',u'Indicator'])
rows = pd.date_range(start='2018-01-01',periods=6,freq='D')
df = pd.DataFrame(np.random.random_integers(1,100,(6,4)),index=rows,columns=cols)

In [245]: df
Out[245]: 
Entity      Company A        Company B       
Indicator       VWAL Volumn      VWAL Volumn
2018-01-01        92      3        22     59
2018-01-02        90     67        52     69
2018-01-03        12     10        35     11
2018-01-04        83      7        62      5
2018-01-05        35     74        27     19
2018-01-06        97     50        93     39
如果我想分别计算每个公司的第3列=VWAL+Volumn,第4列=VWAL Volumn,并将它们作为各自公司下的单独列连接起来,那么最有效的方法是什么?(注意:可能会有数千家公司,几年内会有很多行,我正在考虑使用generator在“公司”标签上迭代,以节省内存并加快进程)

我尝试了下面的方法,但在连接结果时,仍然坚持处理多索引

temp = df.loc(axis=1)[:,'VWAL'].values+df.loc(axis=1)[:,'Volumn'].values
df2 = pd.concat([df,temp],axis=1,join='inner',keys=?????)
您可以使用:

  • 按列中多索引的第一级和聚合
    sum
  • 为对齐数据创建多索引
  • 并按名称对列进行排序

df1 = df.groupby(axis=1, level=0).sum()
df1.columns = pd.MultiIndex.from_product([df1.columns, ['new']])
print (df1)
           Company A Company B
                 new       new
2018-01-01       160       117
2018-01-02       142       185
2018-01-03       145       107
2018-01-04       144       110
2018-01-05       116       178
2018-01-06       119       124

df = pd.concat([df, df1], axis=1).sort_index(axis=1)
print (df)

Entity     Company A             Company B            
Indicator       VWAL Volumn  new      VWAL Volumn  new
2018-01-01        67     93  160        99     18  117
2018-01-02        84     58  142        87     98  185
2018-01-03        97     48  145        74     33  107
2018-01-04        47     97  144        26     84  110
2018-01-05        79     37  116        97     81  178
2018-01-06        69     50  119        56     68  124