Ich bin gespannt, warum df[2]
nicht unterstützt wird, während df.ix[2]
und df[2:3]
beide arbeiten.
In [26]: df.ix[2]
Out[26]:
A 1.027680
B 1.514210
C -1.466963
D -0.162339
Name: 2000-01-03 00:00:00
In [27]: df[2:3]
Out[27]:
A B C D
2000-01-03 1.02768 1.51421 -1.466963 -0.162339
Ich würde erwarten df[2]
, dass es genauso funktioniert, wie df[2:3]
es mit der Python-Indexierungskonvention übereinstimmt. Gibt es einen Entwurfsgrund dafür, dass die Indizierungszeile nicht durch eine einzelne Ganzzahl unterstützt wird?
df.ix[2]
funktioniert nicht - zumindest nicht inpandas version '0.19.2'
[]
, sehen Sie diese Antwort unten . Auch nie verwenden.ix
, es ist veraltetAntworten:
Echo @HYRY, siehe die neuen Dokumente in 0.11
http://pandas.pydata.org/pandas-docs/stable/indexing.html
Hier haben wir neue Operatoren,
.iloc
die explizit nur die Ganzzahlindizierung und.loc
explizit nur die Etikettenindizierung unterstützenStellen Sie sich zB dieses Szenario vor
[]
schneidet nur die Zeilen (nach Etikettenposition)quelle
iloc
Zeilen undloc
Beschriftungen sind..iloc
sucht nach ihrer Reihenfolge im Index (zB.iloc[[2]]
) ist die zweite "Zeile" indf
. Diese Zeile geschieht auf seinen Index Lage4
..loc
sucht sie nach ihrem Indexwert. Also ist "iloc" vielleicht wie "i" wie inA[i]
? :)df.loc[-1] = df.iloc[[0]]
und diese einfügen möchten ? Der Rahmen kommt mit einer hinzugefügten Indexspalte , die Fehler anzeigtValueError: cannot set a row with mismatched columns
(siehe stackoverflow.com/questions/47340571/… )Der Hauptzweck des DataFrame-Indexierungsoperators:
[]
ist die Auswahl von Spalten.Wenn dem Indizierungsoperator eine Zeichenfolge oder eine Ganzzahl übergeben wird, versucht er, eine Spalte mit diesem bestimmten Namen zu finden und als Serie zurückzugeben.
Also, in der obigen Frage:
df[2]
Sucht nach einem Spaltennamen, der dem ganzzahligen Wert entspricht2
. Diese Spalte existiert nicht und aKeyError
wird ausgelöst.Der DataFrame-Indizierungsoperator ändert das Verhalten vollständig, um Zeilen auszuwählen, wenn die Slice-Notation verwendet wird
Seltsamerweise wählt der DataFrame-Indexierungsoperator bei einem Slice Zeilen aus und kann dies nach ganzzahliger Position oder nach Indexbezeichnung tun.
Dies wird ab der Zeile mit der ganzzahligen Position 2 bis 3 ohne das letzte Element geschnitten. Also nur eine einzige Zeile. Im Folgenden werden Zeilen ausgewählt, die an der ganzzahligen Position 6 beginnen, jedoch nicht 20 pro dritter Zeile enthalten.
Sie können auch Slices verwenden, die aus Zeichenfolgenbeschriftungen bestehen, wenn Ihr DataFrame-Index Zeichenfolgen enthält. Weitere Informationen finden Sie in dieser Lösung unter .iloc vs .loc .
Ich verwende diese Slice-Notation fast nie mit dem Indexierungsoperator, da sie nicht explizit ist und kaum jemals verwendet wird. Wenn Sie in Reihen schneiden, bleiben Sie dabei
.loc/.iloc
.quelle
Sie können sich DataFrame als ein Diktat der Serie vorstellen.
df[key]
Versuchen Sie, den Spaltenindex nach auszuwählen,key
und geben Sie ein Serienobjekt zurück.Das Schneiden innerhalb von [] schneidet jedoch die Zeilen, da dies eine sehr häufige Operation ist.
Sie können das Dokument für Details lesen:
http://pandas.pydata.org/pandas-docs/stable/indexing.html#basics
quelle
Für den indexbasierten Zugriff auf die Pandas-Tabelle kann auch die Option numpy.as_array in Betracht gezogen werden , um die Tabelle in das Numpy-Array als zu konvertieren
und dann
würde funktionieren.
quelle
Sie können sich den Quellcode ansehen .
DataFrame
hat eine private Funktion_slice()
zum Schneiden der AchseDataFrame
und ermöglicht es dem Parameteraxis
zu bestimmen, welche Achse geschnitten werden soll. Das__getitem__()
forDataFrame
setzt die Achse beim Aufrufen nicht_slice()
. Also das_slice()
Slice es standardmäßig Achse 0.Sie können ein einfaches Experiment durchführen, das Ihnen helfen könnte:
quelle
Sie können den Datenrahmen wie folgt durchlaufen.
quelle