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:
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, dass5
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öhtKeyError
, 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).
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__
:
Hier wird versucht, das Segment zu konvertieren, das convert_to_index_sliceable
Wenn wir uns die Docstrings ansehen:
Unterschrift: df.index._convert_slice_indexer (key, kind = None) Docstring: einen Scheibenindexer konvertieren. floats im start / stop / step
verbietenParameter ---------- 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