52 votes

Sélection avec .loc en python

J'ai vu ce code dans le cahier iPython de quelqu'un et je suis très confus quant à la façon dont ce code fonctionne. Autant que j'ai compris, pd.loc[] est utilisé comme un indexeur basé sur l'emplacement où le format est :

df.loc[index,nom_de_colonne]

Cependant, dans ce cas, le premier index semble être une série de valeurs booléennes. Quelqu'un pourrait-il s'il vous plaît m'expliquer comment fonctionne cette sélection. J'ai essayé de lire la documentation mais je n'ai pas réussi à trouver une explication. Merci !

iris_data.loc[iris_data['class'] == 'versicolor', 'class'] = 'Iris-versicolor'

entrez la description de l'image ici

91voto

piRSquared Points 159

pd.DataFrame.loc peut prendre un ou deux indexeurs. Pour le reste du message, je représenterai le premier indexeur par i et le deuxième indexeur par j.

Si un seul indexeur est fourni, il s'applique à l'index du dataframe et l'indexeur manquant est supposé représenter toutes les colonnes. Ainsi, les deux exemples suivants sont équivalents.

  1. df.loc[i]
  2. df.loc[i, :]

: est utilisé pour représenter toutes les colonnes.

Si les deux indexeurs sont présents, i fait référence aux valeurs de l'index et j fait référence aux valeurs des colonnes.


Maintenant, nous pouvons nous concentrer sur les types de valeurs que i et j peuvent prendre. Utilisons le dataframe suivant df comme exemple:

df = pd.DataFrame([[1, 2], [3, 4]], index=['A', 'B'], columns=['X', 'Y'])

loc a été écrit de telle sorte que i et j peuvent être

  1. des scalaires qui devraient être des valeurs dans les objets d'index respectifs

    df.loc['A', 'Y']
    
    2
  2. des tableaux dont les éléments sont également des membres des objets d'index respectifs (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
    • Remarquez la dimensionnalité de l'objet renvoyé lors du passage de tableaux. i est un tableau comme ci-dessus, loc renvoie un objet dans lequel un index avec ces valeurs est renvoyé. Dans ce cas, parce que j était un scalaire, loc a renvoyé un objet pd.Series. Nous aurions pu manipuler ceci pour renvoyer un dataframe si nous avions passé un tableau pour i et j, et le tableau aurait pu être simplement un tableau de valeurs uniques.

      df.loc[['B', 'A'], ['X']]
      
         X
      B  3
      A  1
  3. des tableaux booléens 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) pour lesquelles le tableau booléen est True.

    df.loc[[True, False], ['X']]
    
       X
    A  1

En plus des indexeurs que vous pouvez passer à loc, il vous permet également de faire des affectations. Maintenant, nous pouvons analyser la ligne de code que vous avez fournie.

iris_data.loc[iris_data['class'] == 'versicolor', 'class'] = 'Iris-versicolor'
  1. iris_data['class'] == 'versicolor' renvoie un tableau booléen.
  2. class est un scalaire qui représente une valeur dans l'objet des colonnes.
  3. 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'
  4. Lorsqu'il est utilisé avec un opérateur d'affectation:

    iris_data.loc[iris_data['class'] == 'versicolor', 'class'] = 'Iris-versicolor'

    Nous attribuons 'Iris-versicolor' pour tous les éléments de la colonne 'class''class' était 'versicolor'

7voto

LangeHaare Points 1030

Cela utilise des dataframes du package pandas. La partie "index" peut être soit un index unique, une liste d'indices, ou une liste de booléens. Vous pouvez en apprendre davantage dans la documentation : https://pandas.pydata.org/pandas-docs/stable/indexing.html

Ainsi, la partie index spécifie un sous-ensemble des lignes à extraire, et le nom_de_colonne (optionnel) spécifie la colonne avec laquelle vous voulez travailler à partir de ce sous-ensemble du dataframe. Donc si vous voulez mettre à jour la colonne 'class' mais seulement dans les lignes où la classe est actuellement définie comme 'versicolor', vous pourriez faire quelque chose comme ce que vous avez listé dans la question :

iris_data.loc[iris_data['class'] == 'versicolor', 'class'] = 'Iris-versicolor'

3voto

Aashish Kumar Points 80

C'est un data-frame pandas et il utilise l'outil de sélection basé sur les étiquettes avec df.loc et à l'intérieur, il y a deux entrées, une pour la ligne et l'autre pour la colonne, donc dans l'entrée de la ligne, il sélectionne toutes les valeurs de ligne où la valeur enregistrée dans la colonne class est versicolor, et dans l'entrée de la colonne, il sélectionne la colonne avec l'étiquette class, et leur attribue la valeur Iris-versicolor. En gros, cela remplace toutes les cellules de la colonne class avec la valeur versicolor par Iris-versicolor.

1voto

mins Points 629
  1. Chaque fois que le slicing (a:n) peut être utilisé, il peut être remplacé par l'indexation fantaisie (par exemple [a,b,c,...,n]). L'indexation fantaisie consiste simplement à lister explicitement toutes les valeurs d'index au lieu de spécifier uniquement les limites.

  2. Chaque fois que l'indexation fantaisie peut être utilisée, elle peut être remplacée par une liste de valeurs booléennes (un masque) de la même taille que l'index. La valeur sera Vrai pour les valeurs d'index qui auraient été incluses dans l'index fantaisie, et Faux pour les valeurs qui auraient été exclues. C'est un autre moyen de lister certaines valeurs d'index, mais qui peut être facilement automatisé dans NumPy et Pandas, par exemple par une comparaison logique (comme dans votre cas).

La deuxième possibilité de remplacement est celle utilisée dans votre exemple. Dans :

iris_data.loc[iris_data['class'] == 'versicolor', 'class'] = 'Iris-versicolor'

le masque

iris_data['class'] == 'versicolor'

est un remplacement pour un index fantaisie long et stupide qui serait une liste de numéros de ligne où la colonne class (une Série) a la valeur versicolor.

Que ce soit un masque booléen apparaît dans un indexeur .iloc ou .loc (par exemple df.loc[mask]) ou directement comme l'index (par exemple df[mask]) dépend de la possibilité d'utiliser une tranche comme index direct. De tels cas sont illustrés dans le mémento des indexeurs suivant :

Pandas indexers loc and iloc cheat-sheet
Mémento des indexeurs loc et iloc de Pandas

0voto

Def_Os Points 847

C'est la sélection basée sur les libellés de pandas, comme expliqué ici : https://pandas.pydata.org/pandas-docs/stable/indexing.html#selection-by-label

Le tableau booléen est essentiellement une méthode de sélection utilisant un masque.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X