HOWTO · Pandas

Spalten als Index in Pandas Dataframe setzen

Dieses Tutorial zeigt, wie du Spalten in einem Pandas-DataFrame mit der Methode `set_index()` oder mithilfe des Parameters `index_col` beim Einlesen einer Datei als Index festlegst.

Auf dieser Seite

Ein neues Pandas-DataFrame verwendet standardmäßig einen ganzzahligen Index, um seine Zeilen zu kennzeichnen. Aussagekräftige Zeilenbezeichnungen kannst du festlegen, indem du set_index() auf ein vorhandenes DataFrame anwendest oder beim Einlesen der Datei index_col an read_csv oder read_excel übergibst. Der erste Ansatz eignet sich, wenn die Daten bereits im Arbeitsspeicher liegen; beim zweiten wählst du die Bezeichnungen direkt beim Import. Die folgenden Beispiele verwenden denselben kleinen Datensatz mit Personen, damit du die Ergebnisse vergleichen kannst. Wähle eine Spalte, deren Werte die Zeilen in deiner Analyse leicht erkennbar machen. Ein Index darf zwar wiederholte Werte enthalten, doch eine Suche nach einem solchen Wert kann mehrere Zeilen zurückgeben.

Eine DataFrame-Spalte mit set_index() als Index festlegen

set_index() ist eine DataFrame-Methode. Standardmäßig gibt sie ein neues DataFrame zurück und entfernt die ausgewählte Spalte aus den regulären Datenspalten. Weise das Ergebnis einer Variablen zu, wenn das ursprüngliche DataFrame unverändert bleiben soll. Übergebe eine Liste mit Spaltennamen, um einen MultiIndex zu erstellen, bei dem eine Kombination von Werten jede Zeile kennzeichnet. Verwende drop=False, wenn die ausgewählten Werte zusätzlich als reguläre Datenspalten erhalten bleiben sollen.

Diese Optionen beeinflussen den Zugriff auf die Daten, nicht den Erhalt der Zeilen. Behalte zum Beispiel eine Namensspalte bei, wenn späterer Code sie sowohl als Bezeichnung als auch als Wert benötigt, oder verwende einen MultiIndex aus Stadt und Alter, wenn diese Kombination für deine Arbeit sinnvoll ist. Soll das vorhandene DataFrame selbst geändert werden, führt set_index(..., inplace=True) diese Änderung direkt aus und gibt None zurück. Das standardmäßig zurückgegebene DataFrame zuzuweisen ist meist leichter nachzuvollziehen und ermöglicht es dir, das Original beizubehalten. Mit reset_index() kannst du zu einem regulären Index zurückkehren: Die aktuellen Indexwerte werden in Spalten eingefügt, und das Ergebnis erhält standardmäßig einen neuen ganzzahligen Index. Das ist nützlich, bevor du Daten exportierst oder wenn nachfolgende Verarbeitungsschritte gewöhnliche Datenspalten erwarten.

Das folgende Beispiel erstellt das Personen-DataFrame und setzt anschließend einmal eine einzelne Spalte und einmal zwei Spalten als Index. Außerdem zeigt es, wie die Namensspalte erhalten bleibt, obwohl sie als Zeilenbezeichnung dient.

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)

Hier enthält by_name die Namen als Zeilenbezeichnungen und City sowie Age als Datenspalten. by_city_and_age verwendet beide ausgewählten Spalten als MultiIndex. Bei with_name_column dienen die Namen als Bezeichnungen, während die Spalte Name zusätzlich erhalten bleibt. Durch die Zuweisungen entstehen separate DataFrames; people behält daher seine ursprünglichen Spalten und den Standardindex. Die print-Anweisung zeigt das Ergebnis mit einer Indexspalte an; genauso kannst du die beiden anderen Variablen untersuchen. Die sichtbaren Spaltenbezeichnungen im unveränderten Beispielcode bleiben Englisch. Um wieder einen regulären ganzzahligen Index einzurichten und die Indexwerte in Spalten zurückzuführen, rufe by_name.reset_index() auf. Das gibt ein weiteres DataFrame zurück, das du zuweisen kannst, wenn du mit der zurückgesetzten Version weiterarbeiten möchtest.

Den Index beim Einlesen einer CSV- oder Excel-Datei mit index_col festlegen

Wenn die Daten aus einer Datei stammen, kannst du den Index beim Einlesen auswählen. Das eigenständige CSV-Beispiel verwendet dieselben Spaltennamen und Datensätze wie das vorherige DataFrame. StringIO ermöglicht es read_csv, den Beispieltext direkt einzulesen. Wenn du eine CSV-Datei auf der Festplatte hast, kannst du den Beispieltext durch einen Dateipfad wie "people.csv" ersetzen:

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)

Das Argument index_col="Name" wählt die Spalte anhand ihrer Überschrift aus. Dadurch stimmen der resultierende Index und die übrigen Datenspalten mit by_name aus dem ersten Beispiel überein. Ein Zahlenwert für index_col wählt stattdessen eine Spalte anhand ihrer nullbasierten Position aus; die erste Spalte hat Position 0. Mit einer Überschrift ist die Auswahl eindeutig und weniger abhängig von der Spaltenreihenfolge. Um beim Import mehrere Spalten als MultiIndex zu verwenden, übergib eine Liste wie index_col=["City", "Age"]. Für eine Excel-Arbeitsmappe lautet der entsprechende Aufruf pd.read_excel("people.xlsx", index_col="Name"). Die Arbeitsmappe muss verfügbar sein, und pandas benötigt eine geeignete installierte Excel-Engine, um ihr Format einzulesen. Der Excel-Aufruf ist hier nur als Muster angegeben, da keine Arbeitsmappe bereitgestellt wird. Auch die sichtbaren Spaltenbezeichnungen im CSV-Beispiel bleiben im unveränderten Code Englisch. Wenn eine Überschrift falsch geschrieben ist oder sich die Spaltenreihenfolge der Datei ändert, prüfe vor der Auswahl die Spaltennamen, damit das gewünschte Feld verwendet wird.