Sélection de données Pandas (loc / iloc / at)

La sélection de données est l'une des opérations les plus fréquemment utilisées dans Pandas. Comprendreloc、iloc、atles différences et les cas d'utilisation vous permettront de traiter les données plus efficacement.


Différence entre loc et iloc

Fonctionnalité loc iloc
Méthode d'indexation Indexation basée sur les étiquettes Indexation basée sur les entiers (positionnelle)
Découpage Inclut la position de fin Exclut la position de fin
Valeur unique Renvoie un scalaire Renvoie un scalaire
Scénario recommandé Lorsqu'il y a des libellés d'index explicites Lors de la sélection par position

Exemple

import pandas as pd

# Créer un DataFrame d'exemple
df = pd.DataFrame({
    "Nom": ["Zhang San", "Li Si", "Wang Wu", "Zhao Liu", "Qian Qi"],
    "Âge": [25, 30, 28, 35, 22],
    "Ville": ["Beijing", "Shanghai", "Guangzhou", "Shenzhen", "Hangzhou"]
}, index=[1, 3, 5, 7, 9])  # Remarque : l'index n'est pas continu

print("DataFrame:")
print(df)
print()

# loc : utiliser l'indexation par libellé (fin incluse)
print("df.loc[1:5] (tranche de libellés, inclut 5) :")
print(df.loc[1:5])
print()

# iloc : utiliser l'indexation positionnelle (fin exclue)
print("df.iloc[0:2] (tranche de positions, exclut 2) :")
print(df.iloc[0:2])

Utilisation de loc

Sélection de lignes

Exemple

import pandas as pd

df = pd.DataFrame({
    "Nom": ["Zhang San", "Li Si", "Wang Wu", "Zhao Liu"],
    "Âge": [25, 30, 28, 35],
    "Ville": ["Beijing", "Shanghai", "Guangzhou", "Shenzhen"]
}, index=["a", "b", "c", "d"])

# Sélectionner une seule ligne (renvoie une Series)
print("Sélection d'une ligne :")
print(df.loc["a"])
print()

# Sélectionner plusieurs lignes
print("Sélection de plusieurs lignes :")
print(df.loc[["a", "c"]])
print()

# Sélection par tranche (inclut le début et la fin)
print("Sélection par tranche :")
print(df.loc["a":"c"])

Sélection de colonnes

Exemple

import pandas as pd

df = pd.DataFrame({
    "Nom": ["Zhang San", "Li Si", "Wang Wu"],
    "Âge": [25, 30, 28],
    "Ville": ["Beijing", "Shanghai", "Guangzhou"]
}, index=["a", "b", "c"])

# Sélection d'une seule colonne
print("Sélection d'une seule colonne :")
print(df.loc[:, "Name"])
print()

# Sélection de plusieurs colonnes
print("Sélection de plusieurs colonnes :")
print(df.loc[:, ["Name", "City"]])
print()

# Sélection par tranche de colonnes
print("Sélectionner des colonnes par tranches :")
print(df.loc[:, "Name":"City"])

Sélection de lignes et de colonnes spécifiques (approche recommandée)

Exemple

import pandas as pd

df = pd.DataFrame({
    "Nom": ["Zhang San", "Li Si", "Wang Wu", "Zhao Liu"],
    "Âge": [25, 30, 28, 35],
    "Ville": ["Beijing", "Shanghai", "Guangzhou", "Shenzhen"]
}, index=["a", "b", "c", "d"])

# Sélectionner des lignes et des colonnes spécifiques
print("Sélectionner une seule valeur :")
print(df.loc["a", "Name"])  # Renvoie "Zhang San"
print(type(df.loc["a", "Name"]))  # Le type est str
print()

# Sélectionner plusieurs lignes et colonnes
print("Sélectionner un sous-ensemble :")
print(df.loc[["a", "c"], ["Name", "City"]])
print()

# Sélection conditionnelle
print("Lignes où Age est supérieur à 28 :")
print(df.loc[df["Age"] > 28])

Utilisation de iloc

Sélection par position

Exemple

import pandas as pd

df = pd.DataFrame({
    "Nom": ["Zhang San", "Li Si", "Wang Wu", "Zhao Liu"],
    "Âge": [25, 30, 28, 35],
    "Ville": ["Beijing", "Shanghai", "Guangzhou", "Shenzhen"]
})

# Sélectionner la ligne 0
print("Sélectionner la ligne 0 :")
print(df.iloc[0])
print()

# Sélectionner les 3 premières lignes
print("Sélectionnez les 3 premières lignes :")
print(df.iloc[:3])
print()

# Sélectionner des lignes spécifiques
print("Sélectionnez des lignes spécifiques :")
print(df.iloc[[0, 2, 3]])
print()

# Indexation négative (en partant de la fin)
print("Sélectionnez la dernière ligne :")
print(df.iloc[-1])
print()

print("Sélectionnez les 3 dernières lignes :")
print(df.iloc[-3:])

Sélection de colonnes

Exemple

import pandas as pd

df = pd.DataFrame({
    "Nom": ["Zhang San", "Li Si", "Wang Wu"],
    "Âge": [25, 30, 28],
    "Ville": ["Beijing", "Shanghai", "Guangzhou"]
})

# Sélectionner la colonne 0
print("Colonne 0 :")
print(df.iloc[:, 0])
print()

# Sélectionner les colonnes 1 et 2
print("Sélection de plusieurs colonnes :")
print(df.iloc[:, [1, 2]])
print()

# Sélection par tranche
print("Sélectionner des colonnes par tranches :")
print(df.iloc[:, 0:2])

at et iat (obtenir une seule valeur)

atetiatsont des accesseurs spécifiquement conçus pour obtenir/définir une seule valeur, ce qui est plus rapide quelocetiloc>更快。

Exemple

import pandas as pd
import time
import numpy as np

# Créer un grand DataFrame pour tester les performances
df = pd.DataFrame(np.random.randn(1000, 10), columns=[f"col_{i}" for i in range(10)])

# at obtient une seule valeur (indexation par étiquette)
print(f"at: {df.at[0, 'col_0']}")

# iat obtient une seule valeur (indexation positionnelle)
print(f"iat: {df.iat[0, 0]}")

# Comparaison des performances
n = 10000

start = time.time()
for _ in range(n):
    _ = df.iloc[0, 0]
print(f"temps iloc : {time.time() - start:.4f}s")

start = time.time()
for _ in range(n):
    _ = df.iat[0, 0]
print(f"temps iat : {time.time() - start:.4f}s")

Sélection conditionnelle

Le filtrage des données à l'aide de conditions booléennes est l'une des opérations les plus courantes.

Exemple

import pandas as pd

df = pd.DataFrame({
    "Nom": ["Zhang San", "Li Si", "Wang Wu", "Zhao Liu"],
    "Âge": [25, 30, 28, 35],
    "Ville": ["Beijing", "Shanghai", "Guangzhou", "Beijing"],
    "Salaire": [12000, 15000, 11000, 18000]
})

# Condition unique
print("Employés âgés de plus de 28 ans :")
print(df[df["Age"] > 28])
print()

# Conditions multiples (avec &)
print("Beijing et salaire supérieur à 12000 :")
print(df[(df["City"] == "Beijing") & (df["Salary"] > 12000)])
print()

# Filtrage isin
print("La ville est Beijing ou Shanghai :")
print(df[df["City"].isin(["Beijing", "Shanghai"])])
print()

# Recherche de chaîne
print("Le nom contient 'San':")
print(df[df["Name"].str.contains("San")])

Notes

1. Le slicing inclut la position de fin

locle slicing inclut la position de fin,ilocne l'inclut pas.

2. Une erreur se produit si l'index n'existe pas

Utilisationlocsi l'index n'existe pas, une KeyError est levée. Vous pouvez utiliserloc[index_list]en combinaison avecreindex。

3. Il est recommandé d'utiliserloc

becauselocPlus lisible et moins sujet aux erreurs, sauf si vous devez sélectionner par position.

at/iatEst le moyen le plus rapide d'accéder à une seule valeur.loc/ilocUtilisé pour sélectionner plusieurs valeurs. Choisir la méthode appropriée peut améliorer les performances et la lisibilité du code.

Autres extensions