logo oujood
🔍

Filtrer des données avec loc et iloc

loc et iloc sont les deux accesseurs fondamentaux de Pandas pour sélectionner des lignes et des colonnes avec précision. Comprendre leur différence et leurs cas d'usage vous évitera beaucoup d'erreurs dans vos analyses.

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.

  📋 Copier le code

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.

  📋 Copier le code

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.

  📋 Copier le code

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.

  📋 Copier le code

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