Probieren Sie das selbst aus:
%Vor% Update : Das ist ein legitimer Fehler in Pandas , der wahrscheinlich eingeführt wurde 0.15.1 im August 2014 oder so. Workarounds: Warte auf eine neue Version, während du eine alte Version von Pandas verwendest; Holen Sie sich einen topaktuellen Entwickler. Version von GitHub; manuell eine einzeilige Änderung in Ihrer Version von pandas
; verwende vorübergehend .ix
anstelle von .loc
.
Ich habe einen DataFrame mit 4,8 Millionen Zeilen, und die Auswahl einer einzelnen Zeile mit .iloc[[ id ]]
(mit einer Liste mit einzelnen Elementen) dauert 489 ms, fast eine halbe Sekunde, 1800 mal langsamer als die identische .ix[[ id ]]
und die 3.500x-Zeit langsamer als .iloc[id]
(die ID als Wert übergeben, nicht als Liste). Um fair zu sein, nimmt .loc[list]
ungefähr die gleiche Zeit in Anspruch, unabhängig von der Länge der Liste, aber ich möchte nicht 489 ms dafür ausgeben, besonders wenn .ix
tausendmal schneller ist und erzeugt ein identisches Ergebnis. Es war mein Verständnis, dass .ix
langsamer sein sollte, oder?
Ich benutze Pandas 0.15.1. Das hervorragende Tutorial zu Indizierung und Auswahl von Daten deutet darauf hin, dass .ix
irgendwie allgemeiner ist und vermutlich langsamer als .loc
und .iloc
. Insbesondere heißt es
Wenn jedoch eine Achse ganzzahlig ist, NUR Label-basierter Zugriff und kein positionaler Zugriff wird unterstützt. In solchen Fällen ist es normalerweise besser, um explizit zu sein und .iloc oder .loc.
Hier ist eine iPython-Sitzung mit den Benchmarks:
%Vor%Ausgabe:
%Vor% Sieht aus, als wäre das Problem nicht in Pandas 0.14
vorhanden. Ich profilierte es mit line_profiler , und ich denke, ich weiß, was passiert ist. Seit Pandas 0.15.1
wird nun ein KeyError
ausgelöst, wenn ein bestimmter Index nicht vorhanden ist. Es sieht so aus, als wenn Sie die Syntax .loc[list]
verwenden, die eine erschöpfende Suche nach einem Index entlang der gesamten Achse durchführt, selbst wenn er gefunden wurde. Das heißt, zuerst gibt es keine vorzeitige Beendigung, falls ein Element gefunden wird, und zweitens ist die Suche in diesem Fall Brute-Force.
File: .../anaconda/lib/python2.7/site-packages/pandas/core/indexing.py
,
Pandas Indizierung war verrückt langsam, ich wechselte zu numpy Indizierung
%Vor%Tags und Links python performance pandas