Pandas-Index

Der Index ist eine Kernkomponente der Pandas-Datenstrukturen und bestimmt, wie Daten organisiert und abgerufen werden. Pandas unterstützt mehrere Indextypen, vom einfachen RangeIndex bis zum komplexen MultiIndex. In diesem Abschnitt wird die Verwendung verschiedener Indextypen im Detail vorgestellt.


Grundlegende Konzepte des Index

Der Index ähnelt einem Datenbank-Primärschlüssel oder einer Excel-Zeilennummer und wird verwendet, um jede Datenzeile eindeutig zu identifizieren. Ein DataFrame hat einen Zeilenindex (index) und einen Spaltenindex (columns).

Beispiel

import pandas as pd

# Ein einfaches DataFrame erstellen (verwendet standardmäßig RangeIndex)
df = pd.DataFrame({
    "Name": ["Zhang San", "Li Si", "Wang Wu"],
    "Alter": [25, 30, 28],
    "City": ["Beijing", "Shanghai", "Guangzhou"]
})

print("DataFrame-Info:")
print(f"Zeilenindex: {df.index.tolist()}")
print(f"Spaltenindex: {df.columns.tolist()}")
print("\n"Daten:")
print(df)

RangeIndex

RangeIndex ist der standardmäßige Ganzzahlen-Index, ähnlich dem von Pythonrange(n), ab 0 ansteigend.

Erstellung und Verwendung

Beispiel

import pandas as pd

# Einen RangeIndex erstellen
idx = pd.RangeIndex(start=0, stop=10, step=1)
print(f"RangeIndex: {idx}")
print(f"Typ: {type(idx)}")

# DataFrame verwendet standardmäßig RangeIndex
df = pd.DataFrame({"A": [1, 2, 3]}, index=range(3))
print(f"\n"Standard-Indextyp: {type(df.index)}")

# Das Zurücksetzen des Index gibt ebenfalls einen RangeIndex zurück
df_reset = df.reset_index()
print(f"Indextyp nach dem Zurücksetzen: {type(df_reset.index)}")

RangeIndex-Merkmale

  • Minimaler Speicherverbrauch
  • Unterstützt standardmäßigen Integer-Positionszugriff
  • Einfache Konvertierung in und aus anderen Indextypen

Indextyp-Konvertierung

Index unterstützt die Konvertierung zwischen mehreren Typen.

In andere Index-Typen konvertieren

Beispiel

import pandas as pd

# Ein Beispiel-DataFrame erstellen
df = pd.DataFrame({"Value": [1, 2, 3, 4]}, index=[10, 20, 30, 40])

# In Index-Typ konvertieren
print("Ursprünglicher Index:", df.index)
print("Index-Typ:", type(df.index))

# In Liste konvertieren
idx_list = df.index.tolist()
print(f"In Liste konvertiert: {idx_list}")

# In NumPy-Array konvertieren
idx_array = df.index.values
print(f"In Array konvertiert: {idx_array}")

# Index auf RangeIndex zurücksetzen
df = df.reset_index(drop=True)
print(f"Reset to RangeIndex: {df.index}")

Benutzerdefinierten Index festlegen

Sie können eine Spalte des DataFrame als Zeilenindex verwenden.

Verwendung von set_index

Beispiel

import pandas as pd

# DataFrame erstellen
df = pd.DataFrame({
    "Student ID": ["S001", "S002", "S003", "S004"],
    "Name": ["Zhang San", "Li Si", "Wang Wu", "Zhao Liu"],
    "Score": [85, 92, 78, 90]
})

print("Originaldaten:")
print(df)
print()

# Die Spalte "Student ID" als Index festlegen
df1 = df.set_index("Student ID")
print("Set Student ID as index:")
print(df1)
print()

# Mehrere Indizes festlegen (dies erzeugt einen MultiIndex)
df2 = df.set_index(["Student ID", "Name"])
print("Mehrere Indizes festlegen:")
print(df2)

Erstellen mit dem index-Parameter

Beispiel

import pandas as pd

# Den Index direkt beim Erstellen des DataFrame angeben
df = pd.DataFrame(
    {"Name": ["Zhang San", "Li Si", "Wang Wu"], "Alter": [25, 30, 28]},
    index=["A001", "A002", "A003"]
)

print(df)
print(f"\n"Index: {df.index.tolist()}")

# DatetimeIndex verwenden
dates = pd.date_range("2024-01-01", periods=3, freq="D")
df_date = pd.DataFrame({"Value": [100, 200, 300]}, index=dates)

print("\n"Datumsindex verwenden:")
print(df_date)
print(f"Index-Typ: {type(df_date.index)}")

Index-Operationen

Index zurücksetzen

Beispiel

import pandas as pd

# DataFrame mit benutzerdefiniertem Index erstellen
df = pd.DataFrame(
    {"Name": ["Zhang San", "Li Si"], "Score": [85, 92]},
    index=["A001", "A002"]
)

# Index auf den Standard-RangeIndex zurücksetzen
df_reset = df.reset_index()
print("Index zurücksetzen:")
print(df_reset)

# drop-Parameter: ob die ursprüngliche Indexspalte verworfen werden soll
df_reset2 = df.reset_index(drop=True)
print("\n"Index zurücksetzen und ursprünglichen Index verwerfen:")
print(df_reset2)

Neuindizierung

Beispiel

import pandas as pd

# DataFrame erstellen
df = pd.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6]}, index=[1, 2, 3])

# Reindex (Indexreihenfolge ändern)
df_reindex = df.reindex([1, 2, 3, 4, 5])
print("Neuindiziert (fehlende Werte mit NaN gefüllt):")
print(df_reindex)

# fill_value zum Füllen fehlender Werte verwenden
df_reindex2 = df.reindex([1, 2, 3, 4, 5], fill_value=0)
print("\n"Neu indiziert (mit 0 gefüllt):")
print(df_reindex2)

Operationen auf Indexebene

Beispiel

import pandas as pd

# MultiIndex-DataFrame erstellen
df = pd.DataFrame({
    "Chinesisch": [85, 92, 78],
    "Mathematik": [90, 88, 95]
}, index=pd.MultiIndex.from_tuples(
    [("Jahrgangsstufe 10", "Klasse A"), ("Jahrgangsstufe 10", "Klasse B"), ("Jahrgangsstufe 11", "Klasse A")],
    names=["Jahrgangsstufe", "Klasse"]
))

print("MultiIndex-DataFrame:")
print(df)
print()

# Äußeren Index abrufen
print(f"Äußerer Index (Jahrgangsstufe): {df.index.get_level_values(0).tolist()}")
print(f"Innerer Index (Klasse): {df.index.get_level_values(1).tolist()}")

Index-Attribute und -Methoden

Attribut/Methode Beschreibung Beispiel
index.tolist() In Python-Liste konvertieren df.index.tolist()
index.values In NumPy-Array konvertieren df.index.values
index.unique() Eindeutige Werte abrufen df.index.unique()
index.is_unique Prüfen, ob der Index eindeutig ist df.index.is_unique
index.astype() Index-Typ konvertieren df.index.astype(str)

Beispiel für die Verwendung von Index-Attributen

Beispiel

import pandas as pd

# Ein Beispiel-DataFrame erstellen
df = pd.DataFrame(
    {"Wert": [1, 2, 3, 4]},
    index=["a", "b", "c", "d"]
)

# Index-Attribute anzeigen
print(f"Index ist eindeutig: {df.index.is_unique}")
print(f"Indexlänge: {len(df.index)}")
print(f"Index-Datentyp: {df.index.dtype}")

# In String-Typ konvertieren
str_index = df.index.astype(str)
print(f"Typ nach der Konvertierung: {str_index.dtype}")

Praxis: Index zur Verbesserung der Abfrageeffizienz nutzen

In der tatsächlichen Datenanalyse kann das Festlegen eines sinnvollen Index die Abfrageeffizienz erheblich verbessern.

Beispiel

import pandas as pd

# Geschäftsdaten simulieren
df = pd.DataFrame({
    "Bestell-ID": range(1000),
    "Kunden-ID": [f"C{i%100:03d}" for i in range(1000)],
    "Produkt": [f"Produkt{i%20}" for i in range(1000)],
    "Betrag": [round(i * 1.5, 2) for i in range(1000)]
})

# Häufig abgefragte Spalten als Index festlegen
df_indexed = df.set_index(["Customer ID", "Product"])

# Index für schnelle Abfrage verwenden (ähnlich einer Primärschlüsselabfrage in einer Datenbank)
result = df_indexed.loc[("C001", "Product 1")]
print("Produkte eines einzelnen Kunden mithilfe des Index abfragen:")
print(result)

# Nach Customer ID für Statistiken gruppieren
print("\nGesamtausgaben jedes Kunden:")
customer_total = df.groupby("Customer ID")["Amount"].sum()
print(customer_total.head(10))

Hinweise

1. Indexwerte müssen eindeutig sein

Wenn Indexwerte nicht eindeutig sind, werden einige Operationen (wie z. B.loclookup) mehrere übereinstimmende Zeilen zurückgeben.

2. Indizes können Namen haben

Das Benennen eines Index kann die Lesbarkeit des Codes verbessern:df.index.name = "学号"

3. Indizes folgen den Datenoperationen

Operationen wie Slicing und Filtern behalten den Index bei; Sie müssen auf die Entsprechung zwischen Index und Daten achten.

Der Index ist entscheidend für die Pandas-Performance. Häufig abgefragte Spalten als Indizes festzulegen, kann die Suchgeschwindigkeit erheblich verbessern, aber zu viele Indizes erhöhen den Schreibaufwand, daher ist ein Kompromiss erforderlich.

Andere Erweiterungen