2016-11-30 15 views
2

ich einen Datenrahmen wie dieses:Pandas kumulative Zählung

0  04:10 obj1 
1  04:10 obj1 
2  04:11 obj1 
3  04:12 obj2 
4  04:12 obj2 
5  04:12 obj1 
6  04:13 obj2 

Gesucht eine kumulative Zählung für alle Objekte wie folgt zu erhalten:

idx  time object obj1_count obj2_count 
0  04:10 obj1  1    0 
1  04:10 obj1  2    0 
2  04:11 obj1  3    0 
3  04:12 obj2  3    1 
4  04:12 obj2  3    2 
5  04:12 obj1  4    2 
6  04:13 obj2  4    3 

mit cumsum versucht zu spielen, aber nicht sicher, dass ist der richtige Weg. Irgendwelche Vorschläge?

Antwort

3

Sie können nur die Spalte mit dem Wert von Interesse vergleichen und rufen cumsum:

In [12]: 
df['obj1_count'] = (df['object'] == 'obj1').cumsum() 
df['obj2_count'] = (df['object'] == 'obj2').cumsum() 
df 

Out[12]: 
     time object obj1_count obj2_count 
idx          
0 04:10 obj1   1   0 
1 04:10 obj1   2   0 
2 04:11 obj1   3   0 
3 04:12 obj2   3   1 
4 04:12 obj2   3   2 
5 04:12 obj1   4   2 
6 04:13 obj2   4   3 

Hier ist der Vergleich eine boolean Serie produzieren:

In [13]: 
df['object'] == 'obj1' 

Out[13]: 
idx 
0  True 
1  True 
2  True 
3 False 
4 False 
5  True 
6 False 
Name: object, dtype: bool 

wenn Sie cumsum auf dem über dem Aufruf True Werte werden in 1 und False in 0 konvertiert und werden summiert kumulativ

2

Sie können diesen Prozess verallgemeinern, indem Sie die cumsum von pd.get_dummies erhalten. Dies sollte für eine beliebige Anzahl von Objekten, die Sie zählen mögen arbeiten, ohne dass diese einzeln angeben:

# Get the cumulative counts. 
counts = pd.get_dummies(df['object']).cumsum() 

# Rename the count columns as appropriate. 
counts = counts.rename(columns=lambda col: col+'_count') 

# Join the counts to the original df. 
df = df.join(counts) 

Die resultierende Ausgabe:

time object obj1_count obj2_count 
0 04:10 obj1   1   0 
1 04:10 obj1   2   0 
2 04:11 obj1   3   0 
3 04:12 obj2   3   1 
4 04:12 obj2   3   2 
5 04:12 obj1   4   2 
6 04:13 obj2   4   3 

Sie können den rename Schritt weglassen, wenn es akzeptabel ist, zu Verwenden Sie count als Präfix anstelle eines Suffix, dh 'count_obj1' anstelle von 'obj1_count'. Verwenden Sie einfach den prefix Parameter von pd.get_dummies:

counts = pd.get_dummies(df['object'], prefix='count').cumsum() 
0

Hier ist mit einer Art und Weise numpy

u, iv = np.unique(
    df.object.values, 
    return_inverse=True 
) 

objcount = pd.DataFrame(
    (iv[:, None] == np.arange(len(u))).cumsum(0), 
    df.index, u 
) 
pd.concat([df, objcount], axis=1) 

enter image description here