Les pandas peuvent effectuer des sélections à partir d'un DataFrame de deux manières principales.
- Par étiquette
- Par emplacement entier
La documentation utilise le terme position pour désigner l' emplacement des nombres entiers . Je n'aime pas cette terminologie car je trouve qu'elle prête à confusion. L'emplacement entier est plus descriptif et correspond exactement à ce que .iloc
signifie. Le mot clé ici est INTEGER - vous devez utiliser des entiers lors de la sélection par emplacement entier.
Avant d'afficher le résumé, assurons-nous tous que ...
.ix est obsolète et ambigu et ne doit jamais être utilisé
Il existe trois indexeurs principaux pour les pandas. Nous avons l'opérateur d'indexation lui-même (les crochets []
) .loc
, et .iloc
. Résumons-les:
[]
- Sélectionne principalement des sous-ensembles de colonnes, mais peut également sélectionner des lignes. Impossible de sélectionner simultanément des lignes et des colonnes.
.loc
- sélectionne les sous-ensembles de lignes et de colonnes par étiquette uniquement
.iloc
- sélectionne les sous-ensembles de lignes et de colonnes par emplacement entier uniquement
Je n'utilise presque jamais .at
ou .iat
car ils n'ajoutent aucune fonctionnalité supplémentaire et avec juste une petite augmentation des performances. Je découragerais leur utilisation à moins que vous n'ayez une application très urgente. Quoi qu'il en soit, nous avons leur résumé:
.at
sélectionne une seule valeur scalaire dans le DataFrame par étiquette uniquement
.iat
sélectionne une seule valeur scalaire dans le DataFrame par emplacement entier uniquement
En plus de la sélection par étiquette et emplacement entier, il existe une sélection booléenne également appelée indexation booléenne .
Exemples expliquant .loc
, .iloc
, la sélection booléenne et .at
et .iat
sont présentés ci - dessous
Nous nous concentrerons d'abord sur les différences entre .loc
et .iloc
. Avant de parler des différences, il est important de comprendre que les DataFrames ont des étiquettes qui aident à identifier chaque colonne et chaque ligne. Jetons un coup d'œil à un exemple de DataFrame:
df = pd.DataFrame({'age':[30, 2, 12, 4, 32, 33, 69],
'color':['blue', 'green', 'red', 'white', 'gray', 'black', 'red'],
'food':['Steak', 'Lamb', 'Mango', 'Apple', 'Cheese', 'Melon', 'Beans'],
'height':[165, 70, 120, 80, 180, 172, 150],
'score':[4.6, 8.3, 9.0, 3.3, 1.8, 9.5, 2.2],
'state':['NY', 'TX', 'FL', 'AL', 'AK', 'TX', 'TX']
},
index=['Jane', 'Nick', 'Aaron', 'Penelope', 'Dean', 'Christina', 'Cornelia'])
Tous les mots en gras sont les étiquettes. Les étiquettes, age
, color
, food
, height
, score
et state
sont utilisés pour les colonnes . Les autres types d' étiquettes, Jane
, Nick
, Aaron
, Penelope
, Dean
, Christina
, Cornelia
sont utilisés comme étiquettes pour les lignes. Collectivement, ces étiquettes de ligne sont appelées index .
Les principaux moyens de sélectionner des lignes particulières dans un DataFrame sont les indexeurs .loc
et .iloc
. Chacun de ces indexeurs peut également être utilisé pour sélectionner simultanément des colonnes, mais il est plus facile de se concentrer uniquement sur les lignes pour le moment. En outre, chacun des indexeurs utilise un ensemble de crochets qui suivent immédiatement leur nom pour effectuer leurs sélections.
.loc sélectionne les données uniquement par libellés
Nous parlerons d'abord de l' .loc
indexeur qui ne sélectionne les données que par les étiquettes d'index ou de colonne. Dans notre exemple de DataFrame, nous avons fourni des noms significatifs comme valeurs pour l'index. De nombreux DataFrames n'auront pas de noms significatifs et seront à la place, par défaut, uniquement les entiers de 0 à n-1, où n est la longueur (nombre de lignes) du DataFrame.
Il existe de nombreuses entrées différentes que vous pouvez utiliser pour .loc
trois d'entre elles sont
- Un string
- Une liste de chaînes
- Notation de tranche utilisant des chaînes comme valeurs de début et de fin
Sélection d'une seule ligne avec .loc avec une chaîne
Pour sélectionner une seule ligne de données, placez l'étiquette d'index à l'intérieur des crochets suivants .loc
.
df.loc['Penelope']
Cela renvoie la ligne de données sous forme de série
age 4
color white
food Apple
height 80
score 3.3
state AL
Name: Penelope, dtype: object
Sélection de plusieurs lignes avec .loc avec une liste de chaînes
df.loc[['Cornelia', 'Jane', 'Dean']]
Cela renvoie un DataFrame avec les lignes dans l'ordre spécifié dans la liste:
Sélection de plusieurs lignes avec .loc avec notation de tranche
La notation de tranche est définie par des valeurs de début, d'arrêt et de pas. Lors du découpage par étiquette, les pandas incluent la valeur d'arrêt dans le retour. Les tranches suivantes d'Aaron à Dean, inclus. Sa taille de pas n'est pas explicitement définie mais par défaut à 1.
df.loc['Aaron':'Dean']
Les tranches complexes peuvent être prises de la même manière que les listes Python.
.iloc sélectionne les données uniquement par emplacement entier
Passons maintenant à .iloc
. Chaque ligne et colonne de données dans un DataFrame a un emplacement entier qui le définit. Cela s'ajoute à l'étiquette qui s'affiche visuellement dans la sortie. L'emplacement entier est simplement le nombre de lignes / colonnes du haut / gauche commençant à 0.
Il existe de nombreuses entrées différentes que vous pouvez utiliser pour .iloc
trois d'entre elles sont
- Un nombre entier
- Une liste d'entiers
- Notation de tranche utilisant des entiers comme valeurs de début et de fin
Sélection d'une seule ligne avec .iloc avec un entier
df.iloc[4]
Cela renvoie la 5ème ligne (emplacement entier 4) sous forme de série
age 32
color gray
food Cheese
height 180
score 1.8
state AK
Name: Dean, dtype: object
Sélection de plusieurs lignes avec .iloc avec une liste d'entiers
df.iloc[[2, -2]]
Cela renvoie un DataFrame des troisième et avant-dernière lignes:
Sélection de plusieurs lignes avec .iloc avec notation de tranche
df.iloc[:5:3]
Sélection simultanée de lignes et de colonnes avec .loc et .iloc
Une excellente capacité des deux .loc/.iloc
est leur capacité à sélectionner simultanément des lignes et des colonnes. Dans les exemples ci-dessus, toutes les colonnes ont été renvoyées à partir de chaque sélection. Nous pouvons choisir des colonnes avec les mêmes types d'entrées que nous le faisons pour les lignes. Nous devons simplement séparer la sélection de ligne et de colonne par une virgule .
Par exemple, nous pouvons sélectionner les lignes Jane et Dean avec uniquement la hauteur, le score et l'état des colonnes comme ceci:
df.loc[['Jane', 'Dean'], 'height':]
Cela utilise une liste d'étiquettes pour les lignes et la notation de tranche pour les colonnes
Nous pouvons naturellement faire des opérations similaires en .iloc
n'utilisant que des entiers.
df.iloc[[1,4], 2]
Nick Lamb
Dean Cheese
Name: food, dtype: object
Sélection simultanée avec étiquettes et emplacement entier
.ix
a été utilisé pour faire des sélections simultanément avec les étiquettes et l'emplacement des nombres entiers, ce qui était utile mais parfois déroutant et ambigu et heureusement, il a été déconseillé. Dans le cas où vous auriez besoin de faire une sélection avec un mélange d'étiquettes et d'emplacements entiers, vous devrez effectuer à la fois vos étiquettes de sélections ou emplacements entiers.
Par exemple, si nous voulons sélectionner des lignes Nick
et Cornelia
avec les colonnes 2 et 4, nous pourrions utiliser .loc
en convertissant les entiers en étiquettes avec ce qui suit:
col_names = df.columns[[2, 4]]
df.loc[['Nick', 'Cornelia'], col_names]
Ou bien, convertissez les étiquettes d'index en entiers avec la get_loc
méthode d'index.
labels = ['Nick', 'Cornelia']
index_ints = [df.index.get_loc(label) for label in labels]
df.iloc[index_ints, [2, 4]]
Sélection booléenne
L'indexeur .loc peut également effectuer une sélection booléenne. Par exemple, si nous souhaitons trouver toutes les lignes où l'âge est supérieur à 30 ans et ne renvoyer que les colonnes food
et, score
nous pouvons faire ce qui suit:
df.loc[df['age'] > 30, ['food', 'score']]
Vous pouvez le reproduire avec .iloc
mais vous ne pouvez pas lui transmettre une série booléenne. Vous devez convertir la série booléenne en un tableau numpy comme ceci:
df.iloc[(df['age'] > 30).values, [2, 4]]
Sélection de toutes les lignes
Il est possible de l'utiliser .loc/.iloc
uniquement pour la sélection de colonne. Vous pouvez sélectionner toutes les lignes en utilisant un deux-points comme ceci:
df.loc[:, 'color':'score':2]
L'opérateur d'indexation,, []
can slice peut également sélectionner des lignes et des colonnes, mais pas simultanément.
La plupart des gens connaissent le but principal de l'opérateur d'indexation DataFrame, qui est de sélectionner des colonnes. Une chaîne sélectionne une seule colonne en tant que série et une liste de chaînes sélectionne plusieurs colonnes en tant que DataFrame.
df['food']
Jane Steak
Nick Lamb
Aaron Mango
Penelope Apple
Dean Cheese
Christina Melon
Cornelia Beans
Name: food, dtype: object
L'utilisation d'une liste sélectionne plusieurs colonnes
df[['food', 'score']]
Ce que les gens sont moins familiers, c'est que, lorsque la notation de tranche est utilisée, la sélection se fait par des étiquettes de ligne ou par un emplacement entier. C'est très déroutant et quelque chose que je n'utilise presque jamais, mais cela fonctionne.
df['Penelope':'Christina'] # slice rows by label
df[2:6:2] # slice rows by integer location
L'explication de la .loc/.iloc
sélection des lignes est fortement préférée. L'opérateur d'indexation seul ne peut pas sélectionner simultanément des lignes et des colonnes.
df[3:5, 'color']
TypeError: unhashable type: 'slice'
Sélection par .at
et.iat
La sélection avec .at
est presque identique à .loc
mais elle ne sélectionne qu'une seule «cellule» dans votre DataFrame. Nous appelons généralement cette cellule une valeur scalaire. Pour l'utiliser .at
, transmettez-lui une étiquette de ligne et de colonne séparées par une virgule.
df.at['Christina', 'color']
'black'
La sélection avec .iat
est presque identique à .iloc
mais elle ne sélectionne qu'une seule valeur scalaire. Vous devez lui transmettre un entier pour les emplacements des lignes et des colonnes
df.iat[2, 5]
'FL'