Auswahl einer Reihe von Pandaserien / Datenrahmen nach ganzzahligem Index

395

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?

cs95
quelle
4
df.ix[2]funktioniert nicht - zumindest nicht inpandas version '0.19.2'
Zahra
9
Um die Differenz zwischen Zeilen- und Spaltenauswahl über den Indizierungsoperator zu sehen [], sehen Sie diese Antwort unten . Auch nie verwenden .ix, es ist veraltet
Ted Petrou

Antworten:

551

Echo @HYRY, siehe die neuen Dokumente in 0.11

http://pandas.pydata.org/pandas-docs/stable/indexing.html

Hier haben wir neue Operatoren, .ilocdie explizit nur die Ganzzahlindizierung und .locexplizit nur die Etikettenindizierung unterstützen

Stellen Sie sich zB dieses Szenario vor

In [1]: df = pd.DataFrame(np.random.rand(5,2),index=range(0,10,2),columns=list('AB'))

In [2]: df
Out[2]: 
          A         B
0  1.068932 -0.794307
2 -0.470056  1.192211
4 -0.284561  0.756029
6  1.037563 -0.267820
8 -0.538478 -0.800654

In [5]: df.iloc[[2]]
Out[5]: 
          A         B
4 -0.284561  0.756029

In [6]: df.loc[[2]]
Out[6]: 
          A         B
2 -0.470056  1.192211

[] schneidet nur die Zeilen (nach Etikettenposition)

Jeff
quelle
7
Was wäre, wenn Sie die 2. UND 3. UND 4. Reihe wollten?
FaCoffee
1
Sie können einfach eine Liste von Indexern übergeben. Die Dokumente sind oben aufgeführt
Jeff
2
Hat jemand eine Rechtfertigung für diese Namen? Ich finde diese schwer zu merken, weil ich nicht sicher bin, warum ilocZeilen und locBeschriftungen sind.
Kilojoule
3
@kilojoules .ilocsucht nach ihrer Reihenfolge im Index (zB .iloc[[2]]) ist die zweite "Zeile" in df. Diese Zeile geschieht auf seinen Index Lage 4. .locsucht sie nach ihrem Indexwert. Also ist "iloc" vielleicht wie "i" wie in A[i]? :)
Jim K.
1
@ Jeff - das funktioniert großartig, aber was passiert, wenn Sie eine Zeile aus Ihrem Datenrahmen duplizieren möchten, z. B. 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/… )
Growler
63

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 entspricht 2. Diese Spalte existiert nicht und a KeyErrorwird 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.

df[2:3]

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.

df[6:20:3]

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.

Ted Petrou
quelle
Der Versuch, Zeilen mit dem Operator indxeing zu einem anderen Datenrahmen hinzuzufügen, aber der andere Datenrahmen bleibt leer. Warum?
FindOutIslamNow
23

Sie können sich DataFrame als ein Diktat der Serie vorstellen. df[key]Versuchen Sie, den Spaltenindex nach auszuwählen, keyund 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

HYRY
quelle
Danke für den Hinweis. Komisch, so etwas macht manchmal immer noch Frage-Pandas. Wenn ich in bestimmten Situationen Ausnahmen zum Verhalten hinzufüge, fühlt es sich für mich so an, als würde man die Konsistenz für ein wenig Bequemlichkeit opfern.
Carl Berger
15

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

np_df = df.as_matrix()

und dann

np_df[i] 

würde funktionieren.

Pavel Prochazka
quelle
11
das macht den ganzen Zweck der Dataframes-Indizes und alles andere, was Pandas bietet, zunichte
Fábio Dias
6

Sie können sich den Quellcode ansehen .

DataFramehat eine private Funktion _slice()zum Schneiden der Achse DataFrameund ermöglicht es dem Parameter axiszu bestimmen, welche Achse geschnitten werden soll. Das __getitem__()for DataFramesetzt 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:

print df._slice(slice(0, 2))
print df._slice(slice(0, 2), 0)
print df._slice(slice(0, 2), 1)
Wartenkuo
quelle
5

Sie können den Datenrahmen wie folgt durchlaufen.

for ad in range(1,dataframe_c.size):
    print(dataframe_c.values[ad])
user1401491
quelle