2016-05-08 10 views
1

in Pandas Ich bin auf der Suche nach einem Wert in einer Spalte "B" in Abhängigkeit von den booleschen Werten aus einer anderen Spalte "A" hinzuzufügen. Also, wenn 'A' wahr ist, dann fange an zu zählen (d. H. Addiere eine Eins jeder neuen Zeile), solange 'A' falsch ist. Wenn 'A' ist True zurückgesetzt und starten Sie erneut zu zählen. Ich habe das mit einer "for" -Schleife gemacht, aber das ist sehr zeitaufwendig. Ich frage mich, ob es keine zeiteffiziente Lösung mehr gibt?Hinzufügen einer Zählung zu früheren Zelle Wert in Pandas

das Ergebnis sollte wie folgt aussehen:

Date  A  B 
01.2010 False 0 
02.2010 True 1 
03.2010 False 2 
04.2010 False 3 
05.2010 True 1 
06.2010 False 2 

Antwort

1

Sie cumsum mit groupby verwenden können und cumcount:

print df 
    Date  A 
0 1.201 False 
1 1.201 True 
2 1.201 False 
3 2.201 True 
4 3.201 False 
5 4.201 False 
6 5.201 True 
7 6.201 False 
roll = df.A.cumsum() 
print roll 
0 0 
1 1 
2 1 
3 2 
4 2 
5 2 
6 3 
7 3 
Name: A, dtype: int32 

df['B'] = df.groupby(roll).cumcount() + 1 
#if in first values are False, output is 0 
df.loc[roll == 0 , 'B'] = 0 
print df 
    Date  A B 
0 1.201 False 0 
1 1.201 True 1 
2 1.201 False 2 
3 2.201 True 1 
4 3.201 False 2 
5 4.201 False 3 
6 5.201 True 1 
7 6.201 False 2 
0

Dank, habe ich die Lösung aus einem anderen Beitrag wie folgt aus:

rolling_count = 0 
def set_counter(val): 

    if val == False: 

    global rolling_count 
    rolling_count +=1 

    else: 

    val == True 
    rolling_count = 1 

    return rolling_count 

df['B'] = df['A'].map(set_counter) 
+0

Ich teste Timing von beiden Lösung und zuerst Ihre Lösung hat unterschiedliche Ausgabe - erste Reihe hat '1' in Ihrer Lösung, nicht' 0' in Spalte 'B'. Und wenn check timings mit 'len (df) = 7000 ':'% Zeit (al (df1)) 100 Schleifen, beste von 3: 3,75 ms pro Schleife' vs '% Zeit (jez (df)) 100 Schleifen, beste von 3: 2,29 ms pro Schleife. Zuletzt haben Sie 2 Punkte für die Annahme verloren. Aber es liegt an Ihnen, wenn Sie denken, dass es besser ist, Ihre Lösung zu akzeptieren. – jezrael

+0

Und wenn Bedarfspunkte, kein Problem. ;) – jezrael

+0

@jezrael, vielen dank. Aus Excel/vba kommend, fand ich meine präsentierte Lösung intuitiver und erfüllte die Aufgabe im wirklichen Leben. Nichtsdestoweniger ist Ihre Lösung pandaesk. Ich muss noch den Unterschied von cumcount() und cumsum() studieren. –

Verwandte Themen