OUJOOD.COM
La différence entre loc et iloc
Les deux accesseurs servent à extraire des portions d'un DataFrame — lignes, colonnes, ou les deux à la fois. La distinction est simple mais importante : loc travaille avec les étiquettes (noms d'index, noms de colonnes), iloc travaille avec les positions entières (0, 1, 2...).
Si votre index est numérique de 0 à N, les deux semblent donner le même résultat — ce qui est trompeur. Dès que vous filtrez un DataFrame et que l'index n'est plus continu, la différence devient critique.
loc : sélection par étiquettes
df.loc[lignes, colonnes] — les deux arguments sont optionnels. Si vous ne précisez que les lignes, toutes les colonnes sont retournées. Les intervalles avec : sont inclusifs des deux côtés avec loc.
import pandas as pd
data = {
"nom": ["Alice", "Bob", "Clara", "David", "Eva"],
"âge": [28, 34, 22, 45, 31],
"ville": ["Paris", "Lyon", "Marseille", "Bordeaux", "Nantes"],
"score": [88, 74, 95, 61, 82]
}
df = pd.DataFrame(data, index=["a", "b", "c", "d", "e"])
# Une ligne par son étiquette
print(df.loc["c"])
# Plusieurs lignes par étiquettes
print(df.loc[["a", "c", "e"]])
# Intervalle inclusif de "b" à "d"
print(df.loc["b":"d"])
# Lignes "a" à "c", colonnes "nom" et "score" seulement
print(df.loc["a":"c", ["nom", "score"]])
L'intervalle "b":"d" avec loc retourne les lignes b, c et d — la borne droite est incluse. C'est différent du slicing Python habituel où la borne droite est exclue. À retenir pour éviter les erreurs de comptage.
iloc : sélection par position
df.iloc[lignes, colonnes] fonctionne exactement comme le slicing Python : les positions commencent à 0 et la borne droite est exclue.
import pandas as pd
data = {
"nom": ["Alice", "Bob", "Clara", "David", "Eva"],
"âge": [28, 34, 22, 45, 31],
"ville": ["Paris", "Lyon", "Marseille", "Bordeaux", "Nantes"],
"score": [88, 74, 95, 61, 82]
}
df = pd.DataFrame(data)
# La ligne à la position 2 (Clara)
print(df.iloc[2])
# Lignes 0 à 2 exclus → lignes 0 et 1 (Alice et Bob)
print(df.iloc[0:2])
# Dernière ligne (indépendamment de la taille du DataFrame)
print(df.iloc[-1])
# Lignes 1 à 3, colonnes 0 et 3 seulement
print(df.iloc[1:4, [0, 3]])
df.iloc[-1] retourne toujours la dernière ligne, quelle que soit la taille du DataFrame. C'est utile quand vous traitez des fichiers dont la longueur varie. df.iloc[-3:] retourne les 3 dernières lignes — la même logique que les listes Python.
Pourquoi loc et iloc donnent parfois des résultats différents
Voici le cas classique qui piège les débutants : après un filtrage, l'index du DataFrame ne repart pas de 0. loc et iloc ne pointent alors plus vers les mêmes lignes.
import pandas as pd
data = {
"nom": ["Alice", "Bob", "Clara", "David", "Eva"],
"score": [88, 74, 95, 61, 82]
}
df = pd.DataFrame(data)
# On filtre : on garde les scores > 75
df_filtre = df[df["score"] > 75]
print(df_filtre)
# Index conservé : 0 (Alice), 2 (Clara), 4 (Eva)
# loc[2] → ligne avec étiquette 2 = Clara
print(df_filtre.loc[2])
# iloc[2] → 3e ligne en position = Eva (index 4)
print(df_filtre.iloc[2])
Après le filtre, l'index contient 0, 2 et 4. loc[2] cherche l'étiquette 2 → Clara. iloc[2] cherche la position 2 (troisième élément) → Eva. Les deux accèdent à des lignes différentes. Pour réinitialiser l'index après un filtre, utilisez df_filtre.reset_index(drop=True).
Modifier des valeurs avec loc
loc et iloc servent aussi à écrire dans un DataFrame — pas seulement à lire. C'est le moyen recommandé pour modifier des cellules précises sans déclencher le SettingWithCopyWarning de Pandas.
import pandas as pd
data = {
"nom": ["Alice", "Bob", "Clara"],
"statut": ["actif", "inactif", "actif"],
"score": [88, 74, 95]
}
df = pd.DataFrame(data)
# Modifier la valeur statut de la ligne 1 (Bob)
df.loc[1, "statut"] = "archivé"
# Mettre à zéro le score de tous les inactifs
df.loc[df["statut"] == "inactif", "score"] = 0
print(df)
df.loc[condition, "colonne"] = valeur est la syntaxe standard pour mettre à jour des cellules en fonction d'une condition. C'est plus sûr et plus lisible que de chaîner deux crochets, qui peut produire des résultats inattendus selon que Pandas travaille sur une copie ou sur la vue originale.
Par carabde | Mis à jour le 26 avril 2026