J'ai vu ce code dans le cahier iPython de quelqu'un et je suis très confus quant à son fonctionnement. Autant que je sache, pd.loc [] est utilisé comme un indexeur basé sur l'emplacement où le format est:
df.loc[index,column_name]
Cependant, dans ce cas, le premier indice semble être une série de valeurs booléennes. Quelqu'un pourrait-il m'expliquer comment cette sélection fonctionne? J'ai essayé de lire la documentation, mais je n'ai pas trouvé d'explication. Merci!
iris_data.loc[iris_data['class'] == 'versicolor', 'class'] = 'Iris-versicolor'
pd.DataFrame.loc
peut prendre un ou deux indexeurs. Pour le reste de l'article, je vais représenter le premier indexeur par i
et le deuxième indexeur par j
.
Si un seul indexeur est fourni, il s'applique à l'index de la structure de données et l'indexeur manquant est supposé représenter toutes les colonnes. Les deux exemples suivants sont donc équivalents.
df.loc[i]
df.loc[i, :]
Où :
est utilisé pour représenter toutes les colonnes.
Si les deux indexeurs sont présents, i
fait référence aux valeurs d'index et j
fait référence aux valeurs de colonne.
Nous pouvons maintenant nous concentrer sur les types de valeurs que i
et j
peuvent assumer. Utilisons le dataframe suivant df
comme exemple:
df = pd.DataFrame([[1, 2], [3, 4]], index=['A', 'B'], columns=['X', 'Y'])
loc
a été écrit pour que i
et j
puissent être
scalaires qui doivent être des valeurs dans les objets d'index respectifs
df.loc['A', 'Y']
2
tableaux dont les éléments sont également membres de l'objet index respectif (notez que l'ordre du tableau que je passe à loc
est respecté
df.loc[['B', 'A'], 'X']
B 3
A 1
Name: X, dtype: int64
Notez la dimensionnalité de l'objet de retour lors du passage de tableaux. i
est un tableau tel qu'il était ci-dessus, loc
renvoie un objet dans lequel un index avec ces valeurs est renvoyé. Dans ce cas, étant donné que j
était un scalaire, loc
a renvoyé un objet pd.Series
. Nous aurions pu manipuler ceci pour renvoyer une image de données si nous passions un tableau pour i
et j
, et le tableau aurait pu être juste un tableau à valeur unique.
df.loc[['B', 'A'], ['X']]
X
B 3
A 1
boolean arrays dont les éléments sont True
ou False
et dont la longueur correspond à la longueur de l'index respectif. Dans ce cas, loc
récupère simplement les lignes (ou colonnes) dans lesquelles le tableau booléen est True
.
df.loc[[True, False], ['X']]
X
A 1
En plus des indexeurs que vous pouvez transmettre à loc
, il vous permet également de faire des affectations. Nous pouvons maintenant décomposer la ligne de code que vous avez fournie.
iris_data.loc[iris_data['class'] == 'versicolor', 'class'] = 'Iris-versicolor'
iris_data['class'] == 'versicolor'
renvoie un tableau booléen.class
est un scalaire qui représente une valeur dans l'objet colonnes.iris_data.loc[iris_data['class'] == 'versicolor', 'class']
renvoie un objet pd.Series
composé de la colonne 'class'
pour toutes les lignes où 'class'
est 'versicolor'
Lorsqu'il est utilisé avec un opérateur d'affectation:
iris_data.loc[iris_data['class'] == 'versicolor', 'class'] = 'Iris-versicolor'
Nous assignons 'Iris-versicolor'
à tous les éléments de la colonne 'class'
où 'class'
était 'versicolor'
C'est un cadre de données pandas utilisant un outil de sélection de base d'étiquettes avec df.loc. Il contient deux entrées, une pour la ligne et une autre pour la colonne. Ainsi, dans l'entrée de ligne, toutes les valeurs de ligne La valeur enregistrée dans la colonne 'classe' est 'versicolor', et dans l'entrée de colonne, elle sélectionne la colonne avec le libellé 'classe' et leur attribue la valeur 'Iris-versicolor' . colonne 'classe' avec la valeur 'versicolor' avec 'Iris-versicolor'.
Cela utilise des images de données du package pandas
. La partie "index" peut être un index unique, une liste d'index ou une liste de booléens. Cela peut être lu dans la documentation: https://pandas.pydata.org/pandas-docs/stable/indexing.html
Ainsi, la partie index
spécifie un sous-ensemble de lignes à extraire et le (facultatif) column_name
spécifie la colonne que vous souhaitez utiliser à partir de ce sous-ensemble de la trame de données. Donc, si vous souhaitez mettre à jour la colonne 'classe' mais uniquement dans les lignes où la classe est actuellement définie comme 'versicolor', vous pouvez faire quelque chose comme ce que vous avez énuméré dans la question:
iris_data.loc[iris_data['class'] == 'versicolor', 'class'] = 'Iris-versicolor'
C'est une sélection pandas
basée sur une étiquette, comme expliqué ici: https://pandas.pydata.org/pandas-docs/stable/indexing.html#selection-by-label
Le tableau booléen est fondamentalement une méthode de sélection utilisant un masque.