Index Pandas
L'Index est un composant essentiel des structures de données Pandas, déterminant comment les données sont organisées et accessibles. Pandas prend en charge plusieurs types d'index, du simple RangeIndex au complexe MultiIndex. Cette section présentera en détail l'utilisation des différents types d'index.
Concepts de base de l'Index
L'Index est similaire à une clé primaire de base de données ou au numéro de ligne Excel, utilisé pour identifier de manière unique chaque ligne de données. Un DataFrame possède un index de lignes (index) et un index de colonnes (columns).
Exemple
# Créer un DataFrame simple (utilise RangeIndex par défaut)
df = pd.DataFrame({
"Nom": ["Zhang San", "Li Si", "Wang Wu"],
"Âge": [25, 30, 28],
"Ville": ["Beijing", "Shanghai", "Guangzhou"]
})
print("Informations sur le DataFrame :")
print(f"Index de lignes : {df.index.tolist()}")
print(f"Index de colonnes : {df.columns.tolist()}")
print("\n"Données :")
print(df)
RangeIndex
RangeIndex est l'index entier par défaut, similaire à celui de Pythonrange(n), augmentant à partir de 0.
Création et utilisation
Exemple
# Créer un RangeIndex
idx = pd.RangeIndex(start=0, stop=10, step=1)
print(f"RangeIndex : {idx}")
print(f"Type : {type(idx)}")
# DataFrame utilise RangeIndex par défaut
df = pd.DataFrame({"A": [1, 2, 3]}, index=range(3))
print(f"\n"Type d'index par défaut : {type(df.index)}")
# La réinitialisation de l'index renvoie également un RangeIndex
df_reset = df.reset_index()
print(f"Type d'index après réinitialisation : {type(df_reset.index)}")
Caractéristiques de RangeIndex
- Utilisation minimale de la mémoire
- Prend en charge l'accès par position entière par défaut
- Conversion facile vers et depuis d'autres types d'index
Conversion de type d'index
L'index prend en charge la conversion entre plusieurs types.
Convertir vers d'autres types d'index
Exemple
# Créer un DataFrame d'exemple
df = pd.DataFrame({"Value": [1, 2, 3, 4]}, index=[10, 20, 30, 40])
# Convertir en type Index
print("Index d'origine :", df.index)
print("Type d'index :", type(df.index))
# Convertir en liste
idx_list = df.index.tolist()
print(f"Converti en liste : {idx_list}")
# Convertir en tableau NumPy
idx_array = df.index.values
print(f"Converti en tableau : {idx_array}")
# Réinitialiser l'index en RangeIndex
df = df.reset_index(drop=True)
print(f"Réinitialisation vers RangeIndex : {df.index}")
Définition d'un index personnalisé
Vous pouvez utiliser une colonne du DataFrame comme index des lignes.
Utilisation de set_index
Exemple
# Créer un DataFrame
df = pd.DataFrame({
"Student ID": ["S001", "S002", "S003", "S004"],
"Nom": ["Zhang San", "Li Si", "Wang Wu", "Zhao Liu"],
"Score": [85, 92, 78, 90]
})
print("Données d'origine :")
print(df)
print()
# Définir la colonne "Student ID" comme index
df1 = df.set_index("Student ID")
print("Définir Student ID comme index :")
print(df1)
print()
# Définir plusieurs index (cela crée un MultiIndex)
df2 = df.set_index(["Student ID", "Name"])
print("Définir plusieurs index :")
print(df2)
Création avec le paramètre index
Exemple
# Spécifier l'index directement lors de la création du DataFrame
df = pd.DataFrame(
{"Nom": ["Zhang San", "Li Si", "Wang Wu"], "Âge": [25, 30, 28]},
index=["A001", "A002", "A003"]
)
print(df)
print(f"\n"Index : {df.index.tolist()}")
# Utiliser DatetimeIndex
dates = pd.date_range("2024-01-01", periods=3, freq="D")
df_date = pd.DataFrame({"Valeur": [100, 200, 300]}, index=dates)
print("\n"Utilisation de l'index de date :")
print(df_date)
print(f"Type d'index : {type(df_date.index)}")
Opérations sur les index
Réinitialisation de l'index
Exemple
# Créer un DataFrame avec un index personnalisé
df = pd.DataFrame(
{"Nom": ["Zhang San", "Li Si"], "Score": [85, 92]},
index=["A001", "A002"]
)
# Réinitialiser l'index au RangeIndex par défaut
df_reset = df.reset_index()
print("Réinitialisation de l'index :")
print(df_reset)
# paramètre drop : indique s'il faut supprimer la colonne d'index d'origine
df_reset2 = df.reset_index(drop=True)
print("\n"Réinitialisation et suppression de l'index d'origine :")
print(df_reset2)
Réindexation
Exemple
# Créer un DataFrame
df = pd.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6]}, index=[1, 2, 3])
# Réindexer (modifier l'ordre de l'index)
df_reindex = df.reindex([1, 2, 3, 4, 5])
print("Réindexé (valeurs manquantes remplies avec NaN) :")
print(df_reindex)
# Utiliser fill_value pour remplir les valeurs manquantes
df_reindex2 = df.reindex([1, 2, 3, 4, 5], fill_value=0)
print("\n"Réindexé (rempli avec 0) :")
print(df_reindex2)
Opérations sur les niveaux d'index
Exemple
# Créer un DataFrame MultiIndex
df = pd.DataFrame({
"Chinois": [85, 92, 78],
"Mathématiques": [90, 88, 95]
}, index=pd.MultiIndex.from_tuples(
[("Niveau 10", "Classe A"), ("Niveau 10", "Classe B"), ("Niveau 11", "Classe A")],
names=["Niveau", "Classe"]
))
print("DataFrame MultiIndex :")
print(df)
print()
# Obtenir l'index externe
print(f"Index externe (grade) : {df.index.get_level_values(0).tolist()}")
print(f"Index interne (class) : {df.index.get_level_values(1).tolist()}")
Attributs et méthodes de l'index
| Attribut/Méthode | Description | Exemple |
|---|---|---|
index.tolist() |
Convertir en liste Python | df.index.tolist() |
index.values |
Convertir en tableau NumPy | df.index.values |
index.unique() |
Obtenir les valeurs uniques | df.index.unique() |
index.is_unique |
Vérifier si l'index est unique | df.index.is_unique |
index.astype() |
Convertir le type d'index | df.index.astype(str) |
Exemple d'utilisation des attributs de l'index
Exemple
# Créer un DataFrame d'exemple
df = pd.DataFrame(
{"Value": [1, 2, 3, 4]},
index=["a", "b", "c", "d"]
)
# Afficher les attributs de l'index
print(f"L'index est unique : {df.index.is_unique}")
print(f"Longueur de l'index : {len(df.index)}")
print(f"Type de données de l'index : {df.index.dtype}")
# Convertir en type chaîne
str_index = df.index.astype(str)
print(f"Type après conversion : {str_index.dtype}")
Pratique : Utiliser l'index pour améliorer l'efficacité des requêtes
Dans l'analyse de données réelle, définir un index raisonnable peut considérablement améliorer l'efficacité des requêtes.
Exemple
# Simuler des données métier
df = pd.DataFrame({
"Order ID": range(1000),
"Customer ID": [f"C{i%100:03d}" for i in range(1000)],
"Product": [f"Product{i%20}" for i in range(1000)],
"Amount": [round(i * 1.5, 2) for i in range(1000)]
})
# Définir les colonnes fréquemment interrogées comme index
df_indexed = df.set_index(["Customer ID", "Product"])
# Utilisation de l'index pour une requête rapide (similaire à une requête sur clé primaire de base de données)
result = df_indexed.loc[("C001", "Product 1")]
print("Interroger les produits d'un client unique à l'aide de l'index :")
print(result)
# Regrouper par Customer ID pour les statistiques
print("\nDépenses totales par client :")
customer_total = df.groupby("Customer ID")["Amount"].sum()
print(customer_total.head(10))
Notes
1. Les valeurs d'index doivent être uniques
Si les valeurs d'index ne sont pas uniques, certaines opérations (telles queloclookup) renverront plusieurs lignes correspondantes.
2. Les index peuvent avoir des noms
Nommer un index peut améliorer la lisibilité du code :df.index.name = "学号"
3. Les index suivent les opérations sur les données
Les opérations telles que le découpage et le filtrage préservent l'index ; vous devez faire attention à la correspondance entre l'index et les données.
Autres extensionsL'index est essentiel pour les performances de Pandas. Définir les colonnes fréquemment interrogées comme index peut grandement améliorer la vitesse de recherche, mais trop d'index augmenteront la surcharge d'écriture, un compromis est donc nécessaire.