Récemment, j'ai commencé à se diversifier de mon endroit sûr (R) vers Python et je suis un peu confus par la localisation / sélection des cellules dans Pandas
. J'ai lu la documentation mais j'ai du mal à comprendre les implications pratiques des différentes options de localisation / sélection.
- Y a-t-il une raison pour laquelle je devrais utiliser
.loc
ou.iloc
sur l'option la plus générale.ix
? - Je comprends que
.loc
,iloc
,at
etiat
peut fournir une certaine exactitude garantie que.ix
ne peut pas offrir, mais je l' ai lu aussi où a.ix
tendance à être la solution la plus rapide dans tous les domaines . - Veuillez expliquer le raisonnement des meilleures pratiques dans le monde réel derrière l'utilisation de quelque chose d'autre que
.ix
?
loc
est une indexation basée sur les étiquettes, donc la recherche d'une valeur dans une ligne,iloc
est une indexation basée sur des lignes entières,ix
est une méthode générale qui exécute d'abord basée sur les étiquettes, si cela échoue, elle passe à base d'entiers.at
est obsolète et il est conseillé de ne plus l'utiliser. L'autre chose à considérer est ce que vous essayez de faire car certaines de ces méthodes permettent le découpage et l'affectation des colonnes, pour être honnête, les documents sont assez clairs: pandas.pydata.org/pandas-docs/stable/indexing.htmlat
c'est obsolète? Je ne le vois pas dans les documents at (ou iat ).loc
,ix
etiloc
ici: stackoverflow.com/questions/31593201/…Réponses:
loc: fonctionne uniquement sur l'index
iloc: travaille sur la position
ix: Vous pouvez obtenir des données de dataframe sans qu'elles soient dans l'index
à: obtenir des valeurs scalaires. C'est une
localisation très rapide : obtenir des valeurs scalaires. C'est un iloc très rapide
http://pyciencia.blogspot.com/2015/05/obtener-y-filtrar-datos-de-un-dataframe.html
Remarque: à partir de
pandas 0.20.0
, l'.ix
indexeur est obsolète au profit des indexeurs.iloc
et plus stricts.loc
.la source
at
etiat
sont des versions très rapides deloc
etiloc
, alors pourquoi utiliserloc
et pasiloc
du tout?at
etiat
un destiné à accéder à un scalaire, c'est-à-dire à un seul élément de la trame de données, tandis queloc
etiloc
sont destinés à accéder à plusieurs éléments en même temps, potentiellement pour effectuer des opérations vectorisées.Mis à jour pour une
pandas
0.20
donnéeix
obsolète. Cela démontre non seulement comment utiliserloc
,iloc
,at
,iat
,set_value
, mais comment accomplir, l' indexation en fonction de position / étiquette mixte.loc
- basé sur les étiquettesVous permet de passer des tableaux 1-D comme indexeurs. Les tableaux peuvent être des tranches (sous-ensembles) de l'index ou de la colonne, ou ils peuvent être des tableaux booléens qui sont égaux en longueur à l'index ou aux colonnes.
Remarque spéciale: lorsqu'un indexeur scalaire est passé,
loc
peut attribuer un nouvel index ou une nouvelle valeur de colonne qui n'existait pas auparavant.iloc
- basé sur la positionSimilaire à
loc
sauf avec des positions plutôt que des valeurs d'index. Cependant, vous ne pouvez pas affecter de nouvelles colonnes ou index.at
- basé sur des étiquettesFonctionne très similaire à
loc
pour les indexeurs scalaires. Impossible de fonctionner sur les indexeurs de tableau. Pouvez! attribuer de nouveaux index et colonnes.Avantage sur
loc
est que c'est plus rapide.L'inconvénient est que vous ne pouvez pas utiliser de tableaux pour les indexeurs.
iat
- basé sur la positionFonctionne de manière similaire à
iloc
. Impossible de fonctionner dans les indexeurs de tableau. Ne peux pas! attribuer de nouveaux index et colonnes.Avantage sur
iloc
est que c'est plus rapide.L'inconvénient est que vous ne pouvez pas utiliser de tableaux pour les indexeurs.
set_value
- basé sur des étiquettesFonctionne très similaire à
loc
pour les indexeurs scalaires. Impossible de fonctionner sur les indexeurs de tableau. Pouvez! attribuer de nouveaux index et colonnesAvantage Super rapide, car il y a très peu de frais généraux!
Inconvénient Il y a très peu de frais généraux car il
pandas
ne fait pas un tas de contrôles de sécurité. Utilisez à vos risques et périls . En outre, cela n'est pas destiné à un usage public.set_value
withtakable=True
- basé sur la positionFonctionne de la même manière que
iloc
. Impossible de fonctionner dans les indexeurs de tableau. Ne peux pas! attribuer de nouveaux index et colonnes.Avantage Super rapide, car il y a très peu de frais généraux!
Inconvénient Il y a très peu de frais généraux car il
pandas
ne fait pas un tas de contrôles de sécurité. Utilisez à vos risques et périls . En outre, cela n'est pas destiné à un usage public.la source
set_value
a été obsolète en faveur de.at
et.iat
depuis la version 0.21Les pandas peuvent effectuer des sélections à partir d'un DataFrame de deux manières principales.
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 uniquementJe 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 uniquementEn 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 - dessousNous 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:Tous les mots en gras sont les étiquettes. Les étiquettes,
age
,color
,food
,height
,score
etstate
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 sontSé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
.Cela renvoie la ligne de données sous forme de série
Sélection de plusieurs lignes avec .loc avec une liste de chaînes
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.
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 sontSélection d'une seule ligne avec .iloc avec un entier
Cela renvoie la 5ème ligne (emplacement entier 4) sous forme de série
Sélection de plusieurs lignes avec .iloc avec une liste d'entiers
Cela renvoie un DataFrame des troisième et avant-dernière lignes:
Sélection de plusieurs lignes avec .iloc avec notation de tranche
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:
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.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
etCornelia
avec les colonnes 2 et 4, nous pourrions utiliser.loc
en convertissant les entiers en étiquettes avec ce qui suit:Ou bien, convertissez les étiquettes d'index en entiers avec la
get_loc
méthode d'index.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: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: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: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.
L'utilisation d'une liste sélectionne plusieurs colonnes
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.
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.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.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 colonnesla source
la source
Commençons par ce petit df:
Nous aurons donc
Avec cela, nous avons:
Ainsi, nous ne pouvons pas utiliser .iat pour le sous-ensemble, où nous devons utiliser uniquement .iloc.
Mais essayons les deux pour sélectionner un df plus grand et vérifions la vitesse ...
Donc, avec .loc, nous pouvons gérer des sous-ensembles et avec .at seulement un seul scalaire, mais .at est plus rapide que .loc
:-)
la source