2016-07-21 11 views
0

Ich habe einen Datenrahmen wie folgt aus:Pandas cumsum auf groupby verhält sich nicht wie erwartet

df = pd.DataFrame({'prob':np.random.uniform(0,1,size), 'target':np.random.randint(0,2, size=size), 
       'pred':np.random.randint(0,2, size=size)}) 

Dass ich cumsum eines groupby eines qcut berechnen möchten:

df['box'] = pd.qcut(df['prob'], 10) 

Meine Erwartung wäre, Berechnen Sie die kumulative Funktion für jede Gruppe in der Reihenfolge, aber berechnet stattdessen eine Summe für jedes Element:

mit der Antwort

0  0.000000 
1  0.018182 
2  0.018182 
3  0.018182 
4  0.000000 
5  0.018182 
6  0.018182 
7  0.018182 
8  0.036364 
9  0.018182 
10 0.000000 
11 0.018182 
12 0.018182 
13 0.036364 
14 0.000000 
15 0.036364 
16 0.036364 
17 0.036364 
18 0.054545 
19 0.000000 
20 0.000000 
21 0.018182 
22 0.018182 
23 0.05454 

statt

'(0.0, 0.1)' 0.04 
'(0.1, 0.2)' 0.12 #(0.08 + previous 0.04) 
'(0.2, 0.3)' 0.17 #(0.05 + previous 0.12) 
+0

Was ist das Ergebnis, das Sie erreichen möchten? – Alex

+0

Schneiden Sie einen Datenrahmen in 10 Boxen nach Wert und führen Sie die kumulative Summe der Werte der Elemente der Gruppe. Summiere die Werte der ersten Gruppe und dividiere durch die Anzahl dieser Klasse im gesamten Datenrahmen. – Ivan

+0

Eine kumulative Summe bedeutet 1 Element für jedes Element in der Gruppe. Klingt, als ob du 1 Element für jede Gruppe willst? – Alex

Antwort

4

Sie möchten den Prozentsatz für jede Gruppe und dann nehmen Sie die cumsum berechnen.

In Ihrem ursprünglichen Code df.groupby('box').target.cumsum() wird die cumsum von jeder Gruppe - so haben Sie ein Element für jedes der Elemente in der gruppierten DataFrame. Dann wird die Abteilung über alle diese Elemente ausgestrahlt werden.

Stattdessen möchten Sie eine Summenstatistik für jede Gruppe erhalten und dann die cumsum über diese Statistiken nehmen.

ch_curve = (df.groupby('box').target.sum()/df.target.sum()).cumsum() 
nch_curve = (df.groupby('box').target_1.sum()/df.target_1.sum()).cumsum() 
+2

Das war ein +1 für Gedankenlesen – piRSquared

+0

Ja, stimme zu. Wie könnte ich die Frage bearbeiten, um dies zu klären? – Ivan

+0

In diesem Fall würde es hilfreich sein, Ihre Absicht in Worten auszudrücken oder einen expliziten DataFrame mit dem gewünschten Ergebnis zu veröffentlichen. – Alex

Verwandte Themen