pandas
Indexation booléenne des dataframes
Recherche…
Introduction
Accès aux lignes d'un fichier de données à l'aide des objets d'indexeur .ix
, .loc
, .iloc
et de la manière dont il se différencie de l'utilisation d'un masque booléen.
Accéder à un DataFrame avec un index booléen
Ce sera notre exemple de trame de données:
df = pd.DataFrame({"color": ['red', 'blue', 'red', 'blue']},
index=[True, False, True, False])
color
True red
False blue
True red
False blue
Accéder avec .loc
df.loc[True]
color
True red
True red
Accéder avec .iloc
df.iloc[True]
>> TypeError
df.iloc[1]
color blue
dtype: object
Il est important de noter que les anciennes versions de pandas ne faisaient pas de distinction entre les entrées booléennes et les entrées entières, donc
.iloc[True]
renverrait la même chose que.iloc[1]
Accéder avec .ix
df.ix[True]
color
True red
True red
df.ix[1]
color blue
dtype: object
Comme vous pouvez le voir, .ix
a deux comportements. Ceci est une très mauvaise pratique en code et doit donc être évité. Veuillez utiliser .iloc
ou .loc
pour être plus explicite.
Application d'un masque booléen à un dataframe
Ce sera notre exemple de trame de données:
color name size
0 red rose big
1 blue violet big
2 red tulip small
3 blue harebell small
En utilisant l’ __getitem__
magique __getitem__
ou []
. En lui donnant une liste de True et False de la même longueur que le dataframe vous donnera:
df[[True, False, True, False]]
color name size
0 red rose big
2 red tulip small
Masquage des données en fonction de la valeur de la colonne
Ce sera notre exemple de trame de données:
color name size
0 red rose big
1 blue violet small
2 red tulip small
3 blue harebell small
En accédant à une seule colonne à partir d'un pd.Series
de données, nous pouvons utiliser une simple comparaison ==
pour comparer chaque élément de la colonne à la variable donnée, produisant une pd.Series
de True et False.
df['size'] == 'small'
0 False
1 True
2 True
3 True
Name: size, dtype: bool
Cette pd.Series
est une extension d'un np.array
qui est une extension d'une list
simple. Ainsi, nous pouvons transmettre ceci à l' __getitem__
ou []
comme dans l'exemple ci-dessus.
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
Masquage des données en fonction de la valeur d'index
Ce sera notre exemple de trame de données:
color size
name
rose red big
violet blue small
tulip red small
harebell blue small
Nous pouvons créer un masque basé sur les valeurs d'index, comme sur une valeur de colonne.
rose_mask = df.index == 'rose'
df[rose_mask]
color size
name
rose red big
Mais faire cela est presque la même que
df.loc['rose']
color red
size big
Name: rose, dtype: object
La différence importante étant que, lorsque .loc
ne rencontre qu'une ligne dans l'index correspondant, il retournera un pd.Series
, s'il rencontre plus de lignes qui correspondent, il retournera un pd.DataFrame
. Cela rend cette méthode plutôt instable.
Ce comportement peut être contrôlé en donnant à la .loc
une liste d'une seule entrée. Cela l'obligera à retourner un bloc de données.
df.loc[['rose']]
color size
name
rose red big