Warum ist DataFrame.loc [[1]] 1.800x langsamer als df.ix [[1]] und 3.500x als df.loc [1]?

8

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%     
osa 22.12.2014, 05:03
quelle

2 Antworten

6

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 ,

%Vor%     
osa 22.12.2014, 06:08
quelle
4

Pandas Indizierung war verrückt langsam, ich wechselte zu numpy Indizierung

%Vor%     
citynorman 11.09.2017 22:57
quelle

Tags und Links