Meiner Meinung nach ist die akzeptierte Antwort verwirrend, da ein DataFrame mit nur fehlenden Werten verwendet wird. Ich habe auch nicht wie der Begriff positionsbasierte für .iloc
und stattdessen lieber ganze Zahl Lage , da es viel mehr beschreibend ist und genau das, was .iloc
steht. Das Schlüsselwort ist INTEGER - .iloc
braucht INTEGERS.
Weitere Informationen finden Sie in meiner äußerst detaillierten Blogserie zur Auswahl von Teilmengen
.ix ist veraltet und mehrdeutig und sollte niemals verwendet werden
Da .ix
es veraltet ist, werden wir uns nur auf die Unterschiede zwischen .loc
und konzentrieren .iloc
.
Bevor wir über die Unterschiede sprechen, ist es wichtig zu verstehen, dass DataFrames Beschriftungen haben, mit denen jede Spalte und jeder Index identifiziert werden kann. Schauen wir uns einen Beispiel-DataFrame an:
df = pd.DataFrame({'age':[30, 2, 12, 4, 32, 33, 69],
'color':['blue', 'green', 'red', 'white', 'gray', 'black', 'red'],
'food':['Steak', 'Lamb', 'Mango', 'Apple', 'Cheese', 'Melon', 'Beans'],
'height':[165, 70, 120, 80, 180, 172, 150],
'score':[4.6, 8.3, 9.0, 3.3, 1.8, 9.5, 2.2],
'state':['NY', 'TX', 'FL', 'AL', 'AK', 'TX', 'TX']
},
index=['Jane', 'Nick', 'Aaron', 'Penelope', 'Dean', 'Christina', 'Cornelia'])
Alle fett gedruckten Wörter sind die Bezeichnungen. Die Etiketten, age
, color
, food
, height
, score
und state
sind für die verwendeten Spalten . Die anderen Labels Jane
, Nick
, Aaron
, Penelope
, Dean
, Christina
, Cornelia
sind für den verwendeten Index .
Die primären Möglichkeiten zum Auswählen bestimmter Zeilen in einem DataFrame sind die Indexer .loc
und .iloc
. Jeder dieser Indexer kann auch zur gleichzeitigen Auswahl von Spalten verwendet werden. Es ist jedoch einfacher, sich vorerst nur auf Zeilen zu konzentrieren. Außerdem verwendet jeder der Indexer eine Reihe von Klammern, die unmittelbar auf seinen Namen folgen, um seine Auswahl zu treffen.
.loc wählt Daten nur anhand von Beschriftungen aus
Wir werden zuerst über den .loc
Indexer sprechen, der nur Daten anhand der Index- oder Spaltenbezeichnungen auswählt. In unserem Beispiel DataFrame haben wir aussagekräftige Namen als Werte für den Index angegeben. Viele DataFrames haben keine aussagekräftigen Namen und verwenden stattdessen standardmäßig nur die Ganzzahlen von 0 bis n-1, wobei n die Länge des DataFrames ist.
Es gibt drei verschiedene Eingänge, für die Sie verwenden können .loc
- Ein Faden
- Eine Liste von Zeichenfolgen
- Slice-Notation mit Strings als Start- und Stoppwert
Auswählen einer einzelnen Zeile mit .loc mit einer Zeichenfolge
Um eine einzelne Datenzeile auszuwählen, platzieren Sie die Indexbezeichnung in den folgenden Klammern .loc
.
df.loc['Penelope']
Dies gibt die Datenzeile als Serie zurück
age 4
color white
food Apple
height 80
score 3.3
state AL
Name: Penelope, dtype: object
Auswählen mehrerer Zeilen mit .loc mit einer Liste von Zeichenfolgen
df.loc[['Cornelia', 'Jane', 'Dean']]
Dies gibt einen DataFrame mit den Zeilen in der in der Liste angegebenen Reihenfolge zurück:
Auswählen mehrerer Zeilen mit .loc mit Slice-Notation
Die Slice-Notation wird durch Start-, Stopp- und Schrittwerte definiert. Beim Schneiden nach Etikett enthält Pandas den Stoppwert in der Rückgabe. Die folgenden Scheiben von Aaron bis einschließlich Dean. Die Schrittgröße ist nicht explizit definiert, sondern standardmäßig 1.
df.loc['Aaron':'Dean']
Komplexe Slices können auf die gleiche Weise wie Python-Listen erstellt werden.
.iloc wählt Daten nur nach ganzzahliger Position aus
Wenden wir uns nun zu .iloc
. Jede Zeile und Spalte von Daten in einem DataFrame hat eine ganzzahlige Position, die sie definiert. Dies gilt zusätzlich zu der Beschriftung, die in der Ausgabe visuell angezeigt wird . Die ganzzahlige Position ist einfach die Anzahl der Zeilen / Spalten von oben / links, beginnend bei 0.
Es gibt drei verschiedene Eingänge, für die Sie verwenden können .iloc
- Eine ganze Zahl
- Eine Liste von ganzen Zahlen
- Slice-Notation mit ganzen Zahlen als Start- und Stoppwerte
Auswählen einer einzelnen Zeile mit .iloc mit einer Ganzzahl
df.iloc[4]
Dies gibt die 5. Zeile (ganzzahlige Position 4) als Serie zurück
age 32
color gray
food Cheese
height 180
score 1.8
state AK
Name: Dean, dtype: object
Auswählen mehrerer Zeilen mit .iloc mit einer Liste von Ganzzahlen
df.iloc[[2, -2]]
Dies gibt einen DataFrame der dritten und vorletzten Zeile zurück:
Auswählen mehrerer Zeilen mit .iloc mit Slice-Notation
df.iloc[:5:3]
Gleichzeitige Auswahl von Zeilen und Spalten mit .loc und .iloc
Eine hervorragende Fähigkeit von beiden .loc/.iloc
ist ihre Fähigkeit, sowohl Zeilen als auch Spalten gleichzeitig auszuwählen. In den obigen Beispielen wurden alle Spalten von jeder Auswahl zurückgegeben. Wir können Spalten mit denselben Eingabetypen auswählen wie für Zeilen. Wir müssen lediglich die Zeilen- und Spaltenauswahl durch ein Komma trennen .
Zum Beispiel können wir die Zeilen Jane und Dean nur mit der Spaltenhöhe, Punktzahl und dem Status wie folgt auswählen:
df.loc[['Jane', 'Dean'], 'height':]
Dies verwendet eine Liste von Beschriftungen für die Zeilen und eine Slice-Notation für die Spalten
Wir können natürlich ähnliche Operationen ausführen, .iloc
indem wir nur ganze Zahlen verwenden.
df.iloc[[1,4], 2]
Nick Lamb
Dean Cheese
Name: food, dtype: object
Gleichzeitige Auswahl mit Beschriftungen und ganzzahliger Position
.ix
wurde verwendet, um gleichzeitig mit Beschriftungen und ganzzahligen Positionen eine Auswahl zu treffen, was nützlich, aber manchmal verwirrend und mehrdeutig war und zum Glück veraltet ist. Für den Fall, dass Sie eine Auswahl mit einer Mischung aus Beschriftungen und ganzzahligen Positionen treffen müssen, müssen Sie sowohl Ihre Auswahlbeschriftungen als auch ganzzahlige Positionen treffen.
Wenn wir beispielsweise Zeilen Nick
und Cornelia
Spalten 2 und 4 auswählen möchten , können wir .loc
die Ganzzahlen in Beschriftungen mit den folgenden Angaben konvertieren:
col_names = df.columns[[2, 4]]
df.loc[['Nick', 'Cornelia'], col_names]
Alternativ können Sie die Indexbezeichnungen mit der get_loc
Indexmethode in Ganzzahlen konvertieren .
labels = ['Nick', 'Cornelia']
index_ints = [df.index.get_loc(label) for label in labels]
df.iloc[index_ints, [2, 4]]
Boolesche Auswahl
Der .loc-Indexer kann auch eine boolesche Auswahl treffen. Wenn wir beispielsweise daran interessiert sind, alle Zeilen zu finden, in denen das Alter über 30 liegt, und nur die Spalten food
und zurückzugeben, score
können wir Folgendes tun:
df.loc[df['age'] > 30, ['food', 'score']]
Sie können dies mit replizieren, .iloc
aber Sie können ihm keine boolesche Reihe übergeben. Sie müssen die boolesche Reihe in ein numpy-Array wie folgt konvertieren:
df.iloc[(df['age'] > 30).values, [2, 4]]
Alle Zeilen auswählen
Es kann .loc/.iloc
nur für die Spaltenauswahl verwendet werden. Sie können alle Zeilen mit einem Doppelpunkt wie folgt auswählen:
df.loc[:, 'color':'score':2]
Der Indizierungsoperator []
kann auch Zeilen und Spalten auswählen, jedoch nicht gleichzeitig.
Die meisten Benutzer kennen den Hauptzweck des DataFrame-Indexierungsoperators, nämlich die Auswahl von Spalten. Eine Zeichenfolge wählt eine einzelne Spalte als Serie aus, und eine Liste von Zeichenfolgen wählt mehrere Spalten als DataFrame aus.
df['food']
Jane Steak
Nick Lamb
Aaron Mango
Penelope Apple
Dean Cheese
Christina Melon
Cornelia Beans
Name: food, dtype: object
Durch die Verwendung einer Liste werden mehrere Spalten ausgewählt
df[['food', 'score']]
Weniger vertraut ist, dass bei Verwendung der Slice-Notation die Auswahl nach Zeilenbeschriftungen oder nach ganzzahliger Position erfolgt. Das ist sehr verwirrend und etwas, das ich fast nie benutze, aber es funktioniert.
df['Penelope':'Christina'] # slice rows by label
df[2:6:2] # slice rows by integer location
Die Aussage .loc/.iloc
zur Auswahl von Zeilen wird sehr bevorzugt. Der Indizierungsoperator allein kann keine Zeilen und Spalten gleichzeitig auswählen.
df[3:5, 'color']
TypeError: unhashable type: 'slice'