wie bekomme ich nach einer Pandas-Gruppe mehrere bedingte Operationen?

Betrachten Sie das folgende Beispiel:

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

Hier muss ich rechnen, fürjede Gruppe in A, die Summe der Elementein B bedingt, dass C nicht negativ ist (d. h.> = 0, eine auf einer anderen Spalte basierende Bedingung). Und umgekehrt für C.

Mein unten stehender Code schlägt jedoch fehl.

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'

So scheint esapply wäre vorzuziehen (weil zutreffen sieht all den Datenrahmen denke ich), aber leider kann ich kein Wörterbuch mit @ verwendapply. Also stecke ich fest. Irgendwelche Ideen

Eine nicht so hübsche und nicht so effiziente Lösung wäre, diese bedingten Variablen zu erstellen, bevor das @ ausgeführt wirgroupby, aber ich bin sicher, dass diese Lösung nicht das Potenzial von @ nutPandas.

So zum Beispiel die erwartete Ausgabe für die Gruppebar undcolumn B wär

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

Ein weiteres Beispiel: Gruppefoo undcolumn 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

Marke, die ich benutzeNaNs anstelle von Null, da eine andere Funktion als eine Summe falsche Ergebnisse (Median) liefern würde, wenn wir Nullen setzen würden.

Mit anderen Worten, dies ist eine einfache bedingte Summe, bei der die Bedingung auf einer anderen Spalte basiert. Vielen Dank

Antworten auf die Frage(6)

Ihre Antwort auf die Frage