简体   繁体   English

熊猫groupby的总和

[英]Sum results of pandas groupby

I have the next DataFrame: 我有下一个DataFrame:

    stock  color  15M_c  60M_c  mediodia  1D_c  1D-15M_c
0    PYPL   rojo   0.32   0.32      0.47 -0.18     -0.50
1    MSFT  verde  -0.11   0.38      0.79 -0.48     -0.35
2    PYPL  verde  -1.44  -1.23      0.28 -1.13      0.30
3       V   rojo  -0.07   0.23      0.70  0.80      0.91
4      JD   rojo   0.87   1.11      1.19  0.43     -0.42
5      FB  verde   0.20   0.05      0.22 -0.66     -0.82
..    ...    ...    ...    ...       ...   ...       ...
282    GM  verde   0.14   0.06      0.47  0.51      0.37
283    FB  verde   0.09  -0.08      0.12  0.22      0.12
284  MSFT   rojo  -0.16  -0.23     -0.06 -0.01      0.14
285  PYPL  verde  -0.14  -0.41     -0.07  0.20      0.30
286     V  verde  -0.02   0.00      0.28  0.42      0.45

And first I grouped by 'stock' and 'color', I do it with the next code: 首先,我将“ stock”和“ color”分组,然后使用下一个代码:

marcos = ['15M_c','60M_c','mediodia','1D_c','1D-15M_c']
grouped = data.groupby(['stock','color'])
res = grouped[marcos].agg([np.size, np.sum])

So in 'res' I get the next DataFrame: 所以在'res'中,我得到了下一个DataFrame:

            15M_c       60M_c       mediodia        1D_c       1D-15M_c      
             size   sum  size   sum     size   sum  size   sum     size   sum
stock color                                                                  
AAPL  rojo   10.0 -0.46  10.0 -0.20     10.0 -0.33  10.0 -0.25     10.0  0.18
      verde   8.0  1.39   8.0  2.48      8.0  1.06   8.0 -1.57      8.0 -2.88
...   ...      ..    ..    ..    ..       ..    ..    ..    ..       ..    ..
FB    verde  15.0  0.92  15.0 -0.64     15.0 -0.11  15.0 -0.89     15.0 -1.80
MSFT  rojo   11.0  0.47  11.0  2.07     11.0  2.71  11.0  4.37     11.0  3.83
      verde  18.0  1.46  18.0  2.12     18.0  1.26  18.0  0.97     18.0 -0.54
PYPL  rojo    9.0  1.06   9.0  2.68      9.0  5.02   9.0  3.98      9.0  2.84
      verde  17.0 -1.57  17.0 -2.40     17.0  0.29  17.0 -0.48     17.0  1.08
V     rojo    1.0 -0.22   1.0 -0.28      1.0 -0.36   1.0 -0.29      1.0 -0.06
      verde   9.0 -1.01   9.0 -1.42      9.0 -0.86   9.0  0.58      9.0  1.61

And then I want to sum 'verde' row with 'rojo' row for each 'stock', but multipliying rojo sum by -1. 然后,我想为每个“股票”将“ verde”行与“ rojo”行相加,但将rojo sum乘以-1。 The final result I wanted is: 我想要的最终结果是:

           15M_c 60M_c mediodia  1D_c 1D-15M_c      
      size   sum   sum      sum   sum      sum
stock                                                                  
AAPL  18.0  1.85  2.68     1.39 -1.32    -3.06
...     ..    ..    ..       ..    ..       ..
FB    15.0  0.92 -0.64    -0.11 -0.89    -1.80
MSFT  29.0  0.99  0.05    -1.45 -3.40    -4.37
PYPL  26.0 -2.63 -5.08       ..    ..       ..
V     10.0 -0.79 -1.14       ..    ..       ..

Thank you very much in advance for your help. 预先非常感谢您的帮助。

Convert the columns in marcos based on the value of color 根据color值转换marcos的列

import numpy as np
for m in marcos:
    data[m] = np.where(data['color'] == 'rojo', -data[m], data[m])

Then you can skip grouping by color altogether: 然后,您可以完全跳过按颜色分组:

grouped = foo.groupby(['stock'])
res = grouped[marcos].agg([np.size, np.sum])

pandas.IndexSlice

Use loc and IndexSlice to change the sign of appropriate values. 使用locIndexSlice更改适当值的符号。 Then use sum(level=0) 然后使用sum(level=0)

islc = pd.IndexSlice
res.loc[islc[:, 'rojo'], islc[:, 'sum']] *= -1
res.sum(level=0)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM