pandas
Booleaanse indexering van dataframes
Zoeken…
Invoering
Toegang tot rijen in een dataframe met behulp van de dataframe indexer voorwerpen .ix
, .loc
, .iloc
en hoe het zich van het gebruik van een boolean masker.
Toegang tot een DataFrame met een booleaanse index
Dit wordt ons voorbeeldgegevensframe:
df = pd.DataFrame({"color": ['red', 'blue', 'red', 'blue']},
index=[True, False, True, False])
color
True red
False blue
True red
False blue
Toegang met .loc
df.loc[True]
color
True red
True red
Toegang met .iloc
df.iloc[True]
>> TypeError
df.iloc[1]
color blue
dtype: object
Belangrijk om op te merken is dat oudere versies van panda's geen onderscheid maakten tussen Booleaanse en gehele invoer, dus
.iloc[True]
zou hetzelfde zijn als.iloc[1]
Toegang met .ix
df.ix[True]
color
True red
True red
df.ix[1]
color blue
dtype: object
Zoals u ziet, heeft .ix
twee gedragingen. Dit is een zeer slechte gewoonte in code en moet daarom worden vermeden. Gelieve gebruik .iloc
of .loc
om meer expliciet zijn.
Een boolean-masker toepassen op een dataframe
Dit wordt ons voorbeeldgegevensframe:
color name size
0 red rose big
1 blue violet big
2 red tulip small
3 blue harebell small
Gebruik de magische __getitem__
of []
accessor. Als je het een lijst geeft met Waar en Onwaar van dezelfde lengte als het dataframe, krijg je:
df[[True, False, True, False]]
color name size
0 red rose big
2 red tulip small
Gegevens maskeren op basis van kolomwaarde
Dit wordt ons voorbeeldgegevensframe:
color name size
0 red rose big
1 blue violet small
2 red tulip small
3 blue harebell small
Toegang tot een enkele kolom vanuit een gegevensframe, kunnen we een eenvoudige vergelijking ==
gebruiken om elk element in de kolom te vergelijken met de gegeven variabele, waardoor een pd.Series
wordt geproduceerd. pd.Series
waar en onwaar
df['size'] == 'small'
0 False
1 True
2 True
3 True
Name: size, dtype: bool
Deze pd.Series
is een extensie van een np.array
, een extensie van een eenvoudige list
. We kunnen dit dus overhandigen aan de __getitem__
of []
accessor zoals in het bovenstaande voorbeeld.
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
Gegevens maskeren op basis van indexwaarde
Dit wordt ons voorbeeldgegevensframe:
color size
name
rose red big
violet blue small
tulip red small
harebell blue small
We kunnen een masker maken op basis van de indexwaarden, net als op een kolomwaarde.
rose_mask = df.index == 'rose'
df[rose_mask]
color size
name
rose red big
Maar dit is bijna hetzelfde als
df.loc['rose']
color red
size big
Name: rose, dtype: object
Het belangrijke verschil is dat wanneer .loc
slechts één rij in de overeenkomende index tegenkomt, het een pd.Series
retourneert. pd.Series
, als het meer rijen tegenkomt die overeenkomen, retourneert het een pd.DataFrame
. Dit maakt deze methode nogal onstabiel.
Dit gedrag kan worden beheerst door de .loc
een lijst te geven van een enkel item. Dit zal het dwingen om een dataframe terug te sturen.
df.loc[['rose']]
color size
name
rose red big