web-dev-qa-db-fra.com

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 à 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'

 enter image description here

26
bugsyb

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.

  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 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

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

    df.loc['A', 'Y']
    
    2
    
  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
      
  3. 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'
  1. iris_data['class'] == 'versicolor' renvoie un tableau booléen.
  2. class est un scalaire qui représente une valeur dans l'objet 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 assignons 'Iris-versicolor' à tous les éléments de la colonne 'class''class' était 'versicolor'

51
piRSquared

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'.

3
Aashish Kumar

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'
3
LangeHaare

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.

0
Def_Os