Warum verhält sich .loc unterschiedlich, je nachdem, ob Werte gedruckt oder zugewiesen werden?

9

Ich war verwirrt über das folgende Verhalten. Wenn ich einen Datenrahmen wie diesen habe:

%Vor%

sieht wie folgt aus:

%Vor%

Ich erhalte den erwarteten Fehler

  

TypeError: kann mit diesen Indexern [3] vom Typ 'int'

keine Slice-Indizierung durchführen

wenn ich den folgenden Ausschnitt mit .loc versuche:

%Vor%

Es wird erwartet, da ich eine ganze Zahl als Index übergebe und nicht einen der Buchstaben, die in index enthalten sind.

Allerdings, wenn ich es jetzt versuche

%Vor%

es funktioniert gut und gibt mir die Ausgabe:

%Vor%

Meine Frage ist, warum derselbe Befehl fehlschlägt, wenn etwas gedruckt wird und warum es funktioniert, wenn ein Wert zugewiesen wird. Wenn ich die Doc-Zeichenfolge für .loc überprüfe, hätte ich erwartet, dass dies immer zu dem oben erwähnten Fehler führen würde (siehe insbesondere den fett gedruckten Teil):

  

Zulässige Eingaben sind:

     
  • Ein einzelnes Label, z.B. 5 oder 'a' , ( Beachten Sie, dass 5 als Label des Index interpretiert wird und ** nie als Ganzzahl   Position entlang des Index **).
  •   
  • Eine Liste oder ein Array von Etiketten, z.B. ['a', 'b', 'c'] .
  •   
  • Ein Scheibenobjekt mit Etiketten, z.B. 'a':'f' (Beachten Sie, dass im Gegensatz zu den üblichen Python-Slices beide der Start und der Stopp sind   inklusive!).
  •   
  • Ein boolesches Array.
  •   
  • Eine callable -Funktion mit einem Argument (der aufrufenden Serie, dem DataFrame oder dem Panel), die eine gültige Ausgabe für die Indizierung zurückgibt (eins   der oben genannten)
  •   

.loc erhöht KeyError , wenn die Elemente nicht gefunden werden.

Irgendeine Erklärung dafür; Was fehlt mir hier?

BEARBEITEN

In diese Frage ähnliches Verhalten wird als Fehler betrachtet, der in 0.13 behoben wurde. Ich benutze 0.19.1.

BEARBEITEN 2 Aufbauend auf @ EdChums Beitrag kann man Folgendes tun:

%Vor%

was zu

führt %Vor%

Das ist dann aber immer noch verwirrend für mich, solange

%Vor%

funktioniert gut, der Befehl

%Vor%

gibt den oben erwähnten Indexfehler an.

Zusätzlich, wenn man nun solche Werte zuweist

%Vor%

Das Datenfeld sieht folgendermaßen aus:

%Vor%

Also werden die Werte nicht hinzugefügt, wenn man - oder zumindest I - erwarten würde, dass sie hinzugefügt werden (es wird die Position und nicht die Bezeichnung verwendet).

    
Cleb 25.01.2017, 18:22
quelle

1 Antwort

3

Ich glaube nicht, dass dies ein Fehler ist, sondern eine undokumentierte Semantik, zum Beispiel ist die Einstellung mit Vergrößerung für den einfachen Fall erlaubt, in dem das Zeilenlabel nicht existiert:

%Vor%

und wenn wir ein Slice übergeben, werden die Labels nicht im Slice gefunden, aber da es sich um ein ganzzahliges Slice handelt, wird es in ein ordinales Slice konvertiert:

%Vor%

Der Beitrag, den Sie verlinkt haben, und der Fehler bezog sich auf die Auswahl ohne Zuweisung, wenn eine nicht existierende Markierung übergeben wird, die ein KeyError , das hier anders ist, erhöhen sollte

Wenn wir uns __setitem__ :

%Vor%

Hier wird versucht, das Segment zu konvertieren, das convert_to_index_sliceable :

%Vor%

Wenn wir uns die Docstrings ansehen:

  

Unterschrift: df.index._convert_slice_indexer (key, kind = None) Docstring:   einen Scheibenindexer konvertieren. floats im start / stop / step

verbieten      

Parameter   ---------- Schlüssel: Label des Slice-gebundenen Typs: {'ix', 'loc', 'getitem', 'iloc'} oder None

und dann folgendes ausführen:

%Vor%

Dies wird dann verwendet, um den Index zu teilen:

%Vor%

Wir sehen also, dass das Integer-Slice-Objekt in ein Ordinal-Slice konvertiert wurde, das nach verschiedenen Regeln mit dem df kompatibel war, obwohl Sie scheinbar nicht existierende Labels übergeben haben

    
EdChum 25.01.2017, 23:53
quelle

Tags und Links