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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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.
Andere ErweiterungenDer 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.