Die effiziente Verarbeitung von DataFrame Zeilen mit einer Python-Funktion?
In vielen Orten in unserer Pandas-code verwenden, haben wir einige Python-Funktion process(row)
. Diese Funktion wird verwendet, über DataFrame.iterrows()
, wobei jede row
, und das machen einige Verarbeitung und gibt einen Wert zurück, die wir ultimative sammeln, in eine neue Series
.
Ich weiß, das Nutzungsverhalten umgeht die meisten Leistungen der numpy /Pandas stack.
- Was wäre der beste Weg, um dieses Nutzerverhalten möglichst effiziente
wie möglich? - Können wir möglicherweise tun Sie es, ohne umschreiben die meisten unserer code?
Einem anderen Aspekt dieser Frage: können alle Funktionen umgewandelt werden in ein numpy-effiziente Darstellung? Ich habe viel zu lernen über die numpy /scipy /Pandas stack, aber es scheint, dass wirklich beliebige Logik, können Sie manchmal brauchen, um Sie nur eine langsame Reine Python-Architektur, wie die oben. Ist das der Fall?
InformationsquelleAutor Dun Peal | 2013-08-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie in Ihrer Funktion entlang der Achse=1. Funktion erhält eine Zeile als argument, und alles, was es gibt, werden gesammelt werden in eine neue Serie Objekt
Beispiel:
Als für den zweiten Teil der Frage: die Zeile weisen Operationen, auch optimiert, aber nach pandas
apply
sind nicht die Schnellste Lösung die es gibt. Sie sind sicherlich viel schneller als eine python for-Schleife, aber nicht die Schnellste. Sie können testen, ob durch die zeitliche Vorgänge, und Sie werden den Unterschied sehen.Einige Betrieb umgewandelt werden kann, um Spalte orientiert sind (in meinem Beispiel könnte leicht umgewandelt, um nur
df['a'] + df['b']
), andere jedoch nicht. Vor allem, wenn Sie haben eine Menge von Verzweigungen, spezielle Fälle oder andere Logik, die sein sollten, führen Sie auf Ihre Zeilen. In diesem Fall, wenn dieapply
ist zu langsam sind, würde ich vorschlagen "Cython-izing" code. Cython spielt wirklich sehr schön mit dem NumPy-C-api und geben Sie die maximale Geschwindigkeit, die Sie erreichen können.Oder Sie können versuchen,numba. 🙂
applay
🙂Ich sah, dass Sie nur selten verwenden, gelten zusammen
axis=1
. Gibt es spezifische performance-Gründen? Sollte das nicht der Schnellste Weg, um itterate über die array-Zeile klug?Ich glaube, es ist. Kein besonderer Grund, ich in der Regel mit Daten arbeiten, die Spalte orientiert, so dass ich am Ende nicht haben, um es zu verwenden (es ist also nicht wirklich an der Spitze von meinem Kopf). Ich habe auch den Verdacht, dass Vorgänge, die entlang Zeilen vermieden werden können, die meisten der Zeit, die durch irgendeine Art von Umgestaltung oder
groupby
Betrieb, aber ich habe keine Beweise dafür vor, zurück, hoch, einfach meine intuition, die könnte falsch sein hier.Das ist wahr, wenn Sie können konvertieren Sie Ihre operation zu Spalte orientiert, ist es viel schneller. Danke.
token-link zur Verbesserung der Leistung Abschnitt der Dokumente: pandas.pydata.org/pandas-docs/dev/enhancingperf.html
InformationsquelleAutor Viktor Kerkez