2017-07-07 3 views
0

ich Pandas Datenrahmen haben, die die folgenden Spalten von Integer-Werten:Pandas mit Transformationssumme zu lange dauert

user_id, user_agent_id, appearances 

Anzahl der Reihen unterschiedlich sein, aber sie sind mehr als 4 hunderttausend. Ich möchte eine neue Zeilensumme erstellen, die die Summe aller Erscheinungen für jeden Benutzer darstellt. Also habe ich folgendes tun:

dataframe['total_appearances'] = dataframe['appearances'].groupby(dataframe['user_id']).transform('sum') 

Ich brauche das, weil ich Prozentsatz pro Nutzer von user_agent_id berechnen möchten, die

dataframe['percent'] = dataframe['appearances']/dataframe['total_appearances'] 

ist ich das gleiche tun max-Wert von Prozent zu berechnen

dataframe['max_percent'] = dataframe['percent'].groupby(dataframe['user_id']).transform('max') 

usw.

die Sache ist, während die max-Methode in dem Transformationsverfahren t akes etwa 5m dauert die sum-methode weit länger als 2sec. Ist das natürlich? Gibt es einen schnelleren Weg, um die Informationen des total_appearances zu erhalten?

Antwort

0

Wenn ich die Frage richtig bin zu verstehen, könnte man die ersten beiden Zeilen in einem Schritt mit so etwas wie dies konsolidieren:

# sample data 
df 
    appearances user_id 
0   6  abc 
1   3  abc 
2   5  abc 
3   8  def 
4   4  gfd 
5   2  uio 
6   1  def 
7   8  poi 
8   3  fab 

df['percent'] = df.groupby('user_id').appearances.apply(lambda x: x.div(np.sum(x))) 

df 
    appearances user_id percent 
0   6  abc 0.428571 
1   3  abc 0.214286 
2   5  abc 0.357143 
3   8  def 0.888889 
4   4  gfd 1.000000 
5   2  uio 1.000000 
6   1  def 0.111111 
7   8  poi 1.000000 
8   3  fab 1.000000 

Sehen Sie eine Leistungsverbesserung mit diesen Veränderungen?

+0

Was ist eine Methode? Entschuldigung, es ist der Spaltenname. Auch habe ich diese Syntax nie mit einer Paranthese auf den Spaltennamen gesehen. – Apostolos

+0

Ich habe kein Problem bei der Berechnung der Prozentsatz, sondern der gesamten Darstellung Spalte. Die Transformation ist das Problem :). Aber ich werde überprüfen und zu Ihnen zurückkommen – Apostolos

+0

Name erwarteten Fehler in der Klammer. Vielleicht verpasst du einen Aufruf einer Methode? – Apostolos