2016-05-24 14 views
0

Lass 'sagen, ich habe einen Datenrahmen mit 1 Million Zeilen und 30 Spalten. Ich möchte eine Spalte zum Datenrahmen hinzufügen und der Wert ist "der häufigste Wert der vorherigen 30 Spalten". Ich möchte auch den "zweithäufigsten Wert der vorherigen 30 Spalten"Wie erhält man den zweithäufigsten und zweithäufigsten Wert in Folge?

hinzufügen Ich weiß, dass Sie df.mode (Achse = 1) für "die häufigsten Wert der vorherigen 30 Spalten" tun können, aber es ist so langsam.

Gibt es trotzdem eine Vektorisierung, damit es schnell gehen kann?

Antwort

0

df.mode(axis=1) ist bereits vektorisiert. Sie sollten jedoch überlegen, wie es funktioniert. Es muss für jede Reihe unabhängig arbeiten, was bedeutet, dass Sie von der "Reihen-Haupt-Reihenfolge" profitieren würden, die C Ordnung in NumPy genannt wird. Ein Pandas DataFrame ist immer die Reihenfolge der Spalten. Das bedeutet, dass 30 Werte für die Berechnung des Modus für eine Zeile 30 Seiten Speicher benötigen, was nicht effizient ist.

Versuchen Sie also, Ihre Daten in ein einfaches NumPy-2D-Array zu laden, um zu sehen, ob das hilft, die Dinge zu beschleunigen. Es sollte.

Ich habe versucht, diese auf meinem 1,5 GHz Laptop:

x = np.random.randint(0,5,(10000,30)) 
df = pd.DataFrame(x) 
%timeit df.mode(axis=1) 
%timeit scipy.stats.mode(x, axis=1) 

Die Datenrahmen Art und Weise dauert 6 Sekunden, während die SciPy (row-major) Art und Weise 16 Millisekunden für 10k Zeilen nimmt (!). Sogar SciPy in der Reihenfolge der Spalten ist nicht viel langsamer, was mich glauben lässt, dass die Pandas-Version weniger effizient ist als sie sein könnte.

Verwandte Themen