¿Cómo obtener múltiples operaciones condicionales después de un grupo Pandasby?

considere el siguiente ejemplo:

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

Aquí necesito calcular, paracada grupo en A, la suma de elementosen B condicional en que C sea no negativo (es decir, ser> = 0, una condición basada en otra columna). Y viceversa para C.

Sin embargo, mi código a continuación falla.

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'

Así pareceapply sería preferible (porque aplicave todo el marco de datos, creo), pero desafortunadamente no puedo usar un diccionario conapply. Entonces estoy atascado. ¿Algunas ideas?

Una solución no tan bonita y no tan eficiente sería crear estas variables condicionales antes de ejecutar elgroupby, pero estoy seguro de que esta solución no utiliza el potencial dePandas.

Entonces, por ejemplo, la salida esperada para el grupobar ycolumn B sería

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

Otro ejemplo: grupofoo ycolumn 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

Observa que usoNaNs en lugar de cero porque otra función que una suma daría resultados incorrectos (mediana) si tuviéramos que poner ceros.

En otras palabras, esta es una suma condicional simple donde la condición se basa en otra columna. ¡Gracias!

Respuestas a la pregunta(3)

Su respuesta a la pregunta