2017-05-22 5 views
0

Ich habe einen Pandas Datenrahmen mit der folgenden Struktur (etwa 100 Millionen Zeilen):Verwenden Sie den Date-Time-Index, um Gruppen zu verlangsamen, indem Sie sie in Pandas anwenden?

Date  Value ID 
'1/1/17' 500 1 
'1/2/17' 550 1 
'1/4/17' 600 2 

Wenn ich tue:

def get_coeff_var(group): 
    group['coeff_var'] = group['Value'].std()/group['Value'].mean() 
    return group 

df = df.groupby(['ID']).apply(lambda x: get_coeff_var(x)) 

Es ist extrem schnell abgeschlossen wird.

Aber wenn ich zum ersten Mal des Index auf das Datum und den letzten Monat des Datensatz, dann das gleiche gilt Funktion ein enormes nimmt (dh ich warte nicht einmal kann es zu vollenden) Höhe der Zeit:

df = df.set_index('Date') 
df = df.last('1M') 
df = df.groupby(['ID']).apply(lambda x: get_coeff_var(x)) 

Was ist los?

Antwort

1

Fast immer, mutieren innerhalb einer groupby-apply ist eine schlechte Idee - im Allgemeinen dauert es einen langsamen Weg, obwohl ich nicht sicher bin, was das genaue Problem hier ist.

In Ihrem Fall ist die idiomatische und viel schnellere Möglichkeit, diese Transformation zu tun, wie folgt, und sollte unabhängig von Ihrem Index schnell sein.

gb = df.groupby('ID')['Value'] 
df['coeff_var'] = gb.transform('std')/gb.transform('mean') 
Verwandte Themen