pandas
Boolesche Indizierung von Datenrahmen
Suche…
Einführung
Zugriff auf Zeilen in einem Datenrahmen mit den DataFrame-Indexerobjekten .ix
, .loc
, .iloc
und wie sie sich von der Verwendung einer booleschen Maske unterscheiden
Zugriff auf einen DataFrame mit einem booleschen Index
Dies wird unser Beispieldatenrahmen sein:
df = pd.DataFrame({"color": ['red', 'blue', 'red', 'blue']},
index=[True, False, True, False])
color
True red
False blue
True red
False blue
Zugriff mit .loc
df.loc[True]
color
True red
True red
Zugriff mit .iloc
df.iloc[True]
>> TypeError
df.iloc[1]
color blue
dtype: object
Wichtig zu beachten ist , dass ältere Versionen Pandas nicht zwischen boolean und Integer - Eingang unterschieden, so
.iloc[True]
würde das gleiche wie das Rück.iloc[1]
Zugriff mit .ix
df.ix[True]
color
True red
True red
df.ix[1]
color blue
dtype: object
Wie Sie sehen, hat .ix
zwei Verhalten. Dies ist eine sehr schlechte Praxis im Code und sollte daher vermieden werden. Bitte verwenden Sie .iloc
oder .loc
, um genauer zu sein.
Anwenden einer booleschen Maske auf einen Datenrahmen
Dies wird unser Beispieldatenrahmen sein:
color name size
0 red rose big
1 blue violet big
2 red tulip small
3 blue harebell small
Verwenden des magischen __getitem__
oder []
__getitem__
. Wenn Sie ihm eine Liste von Wahr und Falsch mit derselben Länge wie das Datenfeld geben, erhalten Sie
df[[True, False, True, False]]
color name size
0 red rose big
2 red tulip small
Maskieren von Daten basierend auf dem Spaltenwert
Dies wird unser Beispieldatenrahmen sein:
color name size
0 red rose big
1 blue violet small
2 red tulip small
3 blue harebell small
Beim Zugriff auf eine einzelne Spalte aus einem pd.Series
können wir einen einfachen Vergleich ==
, um jedes Element in der Spalte mit der angegebenen Variablen zu vergleichen und eine pd.Series
von True und False zu erzeugen
df['size'] == 'small'
0 False
1 True
2 True
3 True
Name: size, dtype: bool
Diese pd.Series
ist eine Erweiterung eines np.array
die eine Erweiterung einer einfachen list
. Daher können wir sie wie im obigen Beispiel an __getitem__
oder []
.
size_small_mask = df['size'] == 'small'
df[size_small_mask]
color name size
1 blue violet small
2 red tulip small
3 blue harebell small
Maskieren von Daten basierend auf dem Indexwert
Dies wird unser Beispieldatenrahmen sein:
color size
name
rose red big
violet blue small
tulip red small
harebell blue small
Wir können eine Maske basierend auf den Indexwerten erstellen, genau wie bei einem Spaltenwert.
rose_mask = df.index == 'rose'
df[rose_mask]
color size
name
rose red big
Aber das ist fast das Gleiche wie
df.loc['rose']
color red
size big
Name: rose, dtype: object
Der wichtige Unterschied besteht darin, dass, wenn .loc
nur eine Zeile im übereinstimmenden Index pd.Series
, eine pd.Series
wird. Wenn mehr Zeilen gefunden werden, die übereinstimmen, wird ein pd.DataFrame
. Dies macht diese Methode ziemlich instabil.
Dieses Verhalten kann gesteuert werden, indem dem .loc
eine Liste eines einzelnen Eintrags .loc
. Dadurch wird ein Datenrahmen zurückgegeben.
df.loc[['rose']]
color size
name
rose red big