熊猫groupby的总和

时间:2019-07-10 03:28:40

标签: python pandas

我有下一个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

首先我将“ 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])

所以在'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

然后我想对每个“股票”的“ verde”行与“ rojo”行求和,但是将rojo总和乘以-1。我想要的最终结果是:

           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       ..    ..       ..

非常感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

根据marcos的值转换color中的列

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

然后,您可以完全跳过按颜色分组:

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

答案 1 :(得分:0)

pandas.IndexSlice

使用locIndexSlice更改适当值的符号。然后使用sum(level=0)

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