Aller au contenu principal

Indexation des DataFrames

L'index est une collection ordonnée d'étiquettes servant à la sélection et à l'alignement. Il n’a pas besoin d’être une clé primaire de base de données, mais son unicité et son ordre influencent de nombreuses opérations.

Indexeurs principaux​

import pandas as pd

df = pd.DataFrame({
"order_id": ["order-42", "order-43"],
"status": ["paid", "pending"],
"customer_id": ["C1", "C2"],
"amount": [120, 80],
}, index=["order-42", "order-43"])
df.loc["order-42", ["status", "amount"]] # étiquettes
df.iloc[0:10, [1, 3]] # positions
df.at["order-42", "status"] # un scalaire par étiquette
df.iat[0, 1] # un scalaire par position

Les tranches d'étiquettes avec .loc incluent généralement les deux bornes lorsqu'elles existent ; les tranches positionnelles avec .iloc suivent la convention Python semi-ouverte.

Définir et réinitialiser​

indexed = df.set_index("order_id")
if not indexed.index.is_unique:
raise ValueError("order_id must be unique")
plain = indexed.reset_index()

Vérifiez la propriété is_unique de l'index obtenu et rejetez les doublons lorsque l'unicité est requise. L'argument verify_integrity de set_index est déprécié depuis pandas 3.0. Triez l'index si les opérations suivantes dépendent de tranches ordonnées ou d'un comportement de série temporelle.

MultiIndex​

Un MultiIndex représente plusieurs niveaux d'étiquettes sur un axe. Il est utile lorsque la sélection hiérarchique, le remodelage ou les sorties groupées sont au cœur du travail :

sales = pd.DataFrame({
"country": ["Canada", "Canada"], "city": ["Toronto", "Ottawa"], "amount": [10, 20]
})
by_region = sales.set_index(["country", "city"]).sort_index()
toronto = by_region.loc[("Canada", "Toronto")]
canada = by_region.loc["Canada"]

Préférez des colonnes ordinaires si la hiérarchie est temporaire ou si les outils en aval attendent des tables plates. reset_index restitue les niveaux sous forme de colonnes.

Risque d'alignement​

Les affectations et calculs entre objets pandas s'alignent par étiquette. Si la position est voulue, rendez la conversion explicite et vérifiez les longueurs. L'alignement silencieux est une force de pandas, mais aussi une source fréquente de valeurs manquantes inattendues.

Formes de sélection et étiquettes dupliquées​

Avec ces étiquettes uniques, df.loc["order-42", ["status", "amount"]] renvoie une Series de longueur 2, df.iloc[0:10, [1, 3]] un DataFrame (2, 2), et les deux accès scalaires renvoient "paid". Utilisez df.loc[["order-42"], ["status", "amount"]] pour conserver une table (1, 2). Une tranche positionnelle s’arrête à la fin ; une position scalaire hors limites lève IndexError.

Un Index est une collection ordonnée, pas un ensemble mathématique : les doublons sont permis. Un accès par une seule étiquette peut donc renvoyer plusieurs lignes. Vérifiez df.index.is_unique et df.columns.is_unique avant de supposer un résultat scalaire. Contrairement à loc, reindex construit les étiquettes demandées et insère des valeurs manquantes pour les absentes ; la recherche stricte par étiquette lève KeyError.

Sources​

Explorer les liensOuvrir le réseau