Как получить несколько условных операций после группового Панда?

рассмотрим следующий пример:

import pandas as pd
import numpy as np

df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar',
                         'foo', 'bar', 'foo', 'foo'],
                   'B' : [12,10,-2,-4,-2,5,8,7],
                   'C' : [-5,5,-20,0,1,5,4,-4]})

df
Out[12]: 
     A   B   C
0  foo  12  -5
1  bar  10   5
2  foo  -2 -20
3  bar  -4   0
4  foo  -2   1
5  bar   5   5
6  foo   8   4
7  foo   7  -4

Здесь мне нужно вычислить, длякаждая группа всумма элементовв Б при условии, что C является неотрицательным (т. е. будучи> = 0, условие основано на другом столбце). И наоборот для C.

Однако мой код ниже не работает.

df.groupby('A').agg({'B': lambda x: x[x.C>0].sum(),
                     'C': lambda x: x[x.B>0].sum()})      

AttributeError: 'Series' object has no attribute 'B'

Ну, это похожеapply было бы предпочтительным (потому что применяютсявидит я думаю, что все данные), но, к сожалению, я не могу использовать словарь сapply, Так что я застрял. Есть идеи?

Одним из не очень, но не очень эффективных решений было бы создание этих условных переменных перед запускомgroupby, но я уверен, что это решение не использует потенциалPandas.

Так, например, ожидаемый результат для группыbar а такжеcolumn B было бы

+10 (indeed C equals 5 and is >=0)
-4 (indeed C equals 0 and is >=0)
+5 = 11

Другой пример: группаfoo а такжеcolumn B

NaN (indeed C equals -5 so I dont want to consider the 12 value in B)
+ NaN   (indeed C= -20)
-2    (indeed C=1 so its positive)
+ 8
+NaN = 6

Обратите внимание, что я используюNaNs вместо нуля, потому что другая функция, кроме суммы, дала бы неправильные результаты (медиана), если бы мы ставили нули.

Другими словами, это простая условная сумма, где условие основано на другом столбце. Спасибо!

Ответы на вопрос(3)

Ваш ответ на вопрос