Сумма результатов панд сгруппированных - PullRequest
1 голос
/ 10 июля 2019

У меня есть следующий 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 голосов
/ 10 июля 2019

pandas.IndexSlice

Используйте loc и IndexSlice, чтобы изменить знак соответствующих значений. Тогда используйте sum(level=0)

islc = pd.IndexSlice
res.loc[islc[:, 'rojo'], islc[:, 'sum']] *= -1
res.sum(level=0)
0 голосов
/ 10 июля 2019

Преобразование столбцов в 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])

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...