HOWTO · Pandas

Définir les colonnes comme un index dans Pandas DataFrame

Ce tutoriel montre comment définir des colonnes comme index dans un DataFrame Pandas avec la méthode `set_index()` et le paramètre `index_col` lors de la lecture d’un fichier.

Sur cette page

Un nouveau DataFrame Pandas utilise un index entier par défaut pour identifier ses lignes. Pour leur attribuer des libellés plus parlants, appelez set_index() sur un DataFrame existant, ou transmettez index_col à read_csv ou read_excel au chargement du fichier. La première approche convient lorsque les données sont déjà en mémoire ; la seconde permet de choisir les libellés pendant l’importation. Les exemples ci-dessous utilisent le même petit jeu de données sur des personnes afin que vous puissiez comparer les résultats. Choisissez une colonne dont les valeurs facilitent l’identification des lignes dans votre analyse ; un index peut contenir des valeurs répétées, mais une recherche à partir d’un libellé répété peut renvoyer plusieurs lignes.

Définir une colonne d’un DataFrame comme index avec set_index()

set_index() est une méthode de DataFrame. Par défaut, elle renvoie un nouveau DataFrame et retire la colonne sélectionnée des colonnes de données ordinaires. Affectez le résultat à une variable si vous souhaitez conserver le DataFrame d’origine inchangé. Transmettez une liste de noms de colonnes pour créer un MultiIndex, qui identifie chaque ligne à l’aide d’une combinaison de valeurs. Utilisez drop=False si vous souhaitez également conserver les valeurs sélectionnées parmi les colonnes de données ordinaires.

Ces choix déterminent la façon d’accéder aux données, et non si les lignes sont supprimées. Par exemple, conservez une colonne de noms si du code ultérieur doit l’utiliser à la fois comme libellé et comme valeur, ou utilisez un MultiIndex composé de la ville et de l’âge si cette combinaison est pertinente pour votre travail. Pour modifier directement le DataFrame existant, set_index(..., inplace=True) effectue cette modification et renvoie None ; affecter le DataFrame renvoyé par défaut est généralement plus facile à suivre et permet de préserver l’original. Pour revenir à un index ordinaire, reset_index() place les valeurs de l’index actuel dans des colonnes et attribue par défaut au résultat un nouvel index entier. C’est utile avant d’exporter les données ou lorsque des opérations ultérieures attendent des libellés sous forme de colonnes ordinaires.

L’exemple suivant crée le DataFrame des personnes, puis construit des index à partir d’une colonne, puis de deux colonnes. Il montre également comment conserver la colonne des noms tout en l’utilisant comme libellé de ligne.

import pandas as pd

people = pd.DataFrame({
    "Name": ["Alice", "Bob", "Charlie"],
    "City": ["New York", "Los Angeles", "Chicago"],
    "Age": [25, 30, 35],
})

by_name = people.set_index("Name")
by_city_and_age = people.set_index(["City", "Age"])
with_name_column = people.set_index("Name", drop=False)

print(by_name)

Ici, by_name utilise les noms comme libellés de ligne et conserve City et Age comme colonnes de données. by_city_and_age utilise les deux colonnes sélectionnées pour créer un MultiIndex, tandis que with_name_column utilise les noms comme libellés tout en conservant la colonne Name. Ces affectations créent des DataFrames distincts ; people reste donc disponible avec ses colonnes d’origine et son index par défaut. L’instruction d’affichage montre le résultat avec une seule colonne ; vous pouvez examiner les deux autres variables de la même façon. Les libellés affichés dans l’exemple restent en anglais, conformément au code partagé. Pour rétablir un index entier ordinaire et replacer les valeurs de l’index dans des colonnes, appelez by_name.reset_index() ; cette méthode renvoie un autre DataFrame. Vous pouvez affecter ce résultat à une variable pour continuer à travailler avec la version réinitialisée.

Définir l’index pendant la lecture d’un fichier CSV ou Excel avec index_col

Si les données proviennent d’un fichier, choisissez l’index au moment de leur lecture. Cet exemple CSV autonome utilise les mêmes noms de colonnes et les mêmes enregistrements que le DataFrame précédent. StringIO permet à read_csv de lire directement le texte fourni ; si vous avez un fichier CSV sur disque, vous pouvez adapter l’appel en le remplaçant par un chemin de fichier tel que "people.csv" :

from io import StringIO
import pandas as pd

csv_data = StringIO("""Name,City,Age
Alice,New York,25
Bob,Los Angeles,30
Charlie,Chicago,35
""")
people = pd.read_csv(csv_data, index_col="Name")

print(people)

L’argument index_col="Name" sélectionne la colonne à partir de son en-tête ; l’index obtenu et les colonnes de données restantes correspondent donc à ceux de by_name dans le premier exemple. Une valeur numérique pour index_col sélectionne plutôt une colonne par sa position, en commençant à 0 pour la première ; un nom d’en-tête rend le choix explicite et moins dépendant de l’ordre des colonnes. Pour sélectionner plusieurs colonnes, transmettez une liste telle que index_col=["City", "Age"] afin de créer un MultiIndex pendant l’importation. Pour un classeur Excel, utilisez l’appel de lecture correspondant : pd.read_excel("people.xlsx", index_col="Name"). Le classeur doit être disponible et pandas doit disposer d’un moteur Excel adapté au format pour le lire. L’appel Excel est présenté comme un modèle, car aucun classeur n’est fourni ici. Les noms de colonnes visibles dans les exemples restent en anglais. Si un en-tête est mal orthographié ou si l’ordre des colonnes du fichier change, vérifiez les noms de colonnes avant de choisir l’index afin de sélectionner le champ voulu.