Dans les situations suivantes, ils se comportent de la même manière :
- Sélection d'une seule colonne (
df['A']
est la même chose que df.loc[:, 'A']
-> sélectionne la colonne A)
- Sélection d'une liste de colonnes (
df[['A', 'B', 'C']]
est la même chose que df.loc[:, ['A', 'B', 'C']]
-> sélectionne les colonnes A, B et C)
- Découpage par rangées (
df[1:3]
est la même chose que df.iloc[1:3]
-> sélectionne les lignes 1 et 2. Notez cependant que si vous découpez les lignes avec loc
au lieu de iloc
vous obtiendrez les rangées 1, 2 et 3 en supposant que vous avez une RangeIndex . Voir les détails aquí .)
Cependant, []
ne fonctionne pas dans les situations suivantes :
- Vous pouvez sélectionner une seule ligne avec
df.loc[row_label]
- Vous pouvez sélectionner une liste de lignes avec
df.loc[[row_label1, row_label2]]
- Vous pouvez découper les colonnes avec
df.loc[:, 'A':'C']
Ces trois éléments ne peuvent être réalisés avec []
. Plus important encore, si votre sélection implique à la fois des lignes et des colonnes, l'affectation devient problématique.
df[1:3]['A'] = 5
Cette opération sélectionne les lignes 1 et 2, puis la colonne 'A' de l'objet retourné et lui attribue la valeur 5. Le problème est que l'objet de retour peut être une copie et que cela peut ne pas modifier le DataFrame réel. Cela soulève SettingWithCopyWarning . La manière correcte de faire ce devoir est :
df.loc[1:3, 'A'] = 5
Avec .loc
vous êtes assuré de modifier le DataFrame original. Il vous permet également de découper des colonnes ( df.loc[:, 'C':'F']
), sélectionner une seule ligne ( df.loc[5]
), et sélectionner une liste de lignes ( df.loc[[1, 2, 5]]
).
Notez également que ces deux éléments n'ont pas été inclus dans l'API en même temps. .loc
a été ajouté beaucoup plus tard comme un indexeur plus puissant et plus explicite. Voir La réponse de unutbu pour plus de détails.
Note : Obtenir des colonnes avec []
vs .
est un sujet complètement différent. .
n'est là que par commodité. Elle ne permet d'accéder qu'aux colonnes dont les noms sont des identifiants Python valides (c'est-à-dire qu'ils ne peuvent pas contenir d'espaces, ils ne peuvent pas être composés de chiffres...). Elle ne peut pas être utilisée lorsque les noms entrent en conflit avec les méthodes Series/DataFrame. Elle ne peut pas non plus être utilisée pour des colonnes inexistantes (c'est-à-dire que l'affectation df.a = 1
ne fonctionnera pas s'il n'y a pas de colonne a
). En dehors de cela, .
y []
sont les mêmes.
1 votes
Ou alors
df.col1
? Ces trois méthodes sont essentiellement équivalentes pour le cas très simple de la sélection d'une colonne..loc
vous permettra de faire bien plus que de sélectionner une colonne. Duplicata possible de stackoverflow.com/questions/31593201/1 votes
Ils font la même chose pour les tranches simples. loc est plus explicite, surtout lorsque vos colonnes sont des nombres.
0 votes
Merci @juanpa.arrivillaga. Bon point concernant df.col1, qui est encore une autre méthode de sélection des colonnes. En fait, j'ai déjà examiné cette autre question, plusieurs fois. C'est très bien pour expliquer loc et iloc. Cependant, cette question concerne l'autre méthode : "df['col1']". Je ne comprends pas pourquoi il existe deux (ou trois) façons équivalentes de faire ce qui semble être la même chose.
1 votes
Le gros inconvénient de la troisième méthode est qu'elle est ambiguë lorsque le nom de votre colonne est identique à un attribut ou une méthode pandas existant. Par exemple, vous nommez une colonne 'sum'. Si vous tapez
df.sum
que se passe-t-il ? (alerte spoiler, rien d'utile, bien quedf.sum()
fonctionne toujours heureusement) Donc la 3ème voie doit être vue comme un raccourci qui est bien, mais il faut faire attention avec1 votes
Une bonne explication ici stackoverflow.com/questions/38886080/