Indexausrichtung und Reindexierung
Richten Sie zwei DataFrames mit reindex() an einem gemeinsamen Index aus, füllen Sie fehlende Labels auf und verstehen Sie, wie arithmetische Operationen Indizes ausrichten.
Indexausrichtung und Reindexierung ist eine kostenlose Pandas & NumPy Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Pandas & NumPy Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Pandas & NumPy Academy-Kurs umfasst insgesamt 4 Lektionen.
So richtet Pandas Indizes aus
Eines der leistungsfähigsten – und manchmal überraschenden – Verhaltensweisen von Pandas ist die automatische Indexausrichtung. Wenn Sie zwei Series oder DataFrames addieren, subtrahieren oder anderweitig miteinander kombinieren, richtet Pandas sie vor der Operation zunächst anhand ihrer Indexbeschriftungen aus. Übereinstimmende Beschriftungen werden miteinander verarbeitet; nicht übereinstimmende Beschriftungen führen zu NaN. Dadurch werden stille Fehler aufgrund falsch ausgerichteter Daten verhindert, und Daten aus unterschiedlichen Quellen lassen sich sicher kombinieren, ohne sie vorher manuell sortieren oder neu anordnen zu müssen.
import pandas as pd
s1 = pd.Series([10, 20, 30], index=['a', 'b', 'c'])
s2 = pd.Series([1, 2, 3], index=['b', 'c', 'd'])
# Alignment in action: a→NaN, d→NaN
result = s1 + s2
print('s1 + s2 with automatic alignment:')
print(result)NaN durch nicht übereinstimmende Indizes
Wenn Indexbeschriftungen nicht übereinstimmen, füllt Pandas die fehlenden Einträge mit NaN. Dies ist beabsichtigt: Es signalisiert „Für einen der Operanden gab es keinen entsprechenden Wert“. Überprüfen Sie das Ergebnis arithmetischer Operationen zwischen zwei Series oder DataFrames immer auf unerwartete NaN-Werte – sie weisen auf eine nicht übereinstimmende Indexausrichtung hin. Verwenden Sie im arithmetischen Verfahren fill_value=0 (s1.add(s2, fill_value=0)), um fehlende ausgerichtete Werte als null zu behandeln, statt NaN weiterzugeben.
import pandas as pd
s1 = pd.Series({'a': 10, 'b': 20, 'c': 30})
s2 = pd.Series({'b': 1, 'c': 2, 'd': 3})
# Default: NaN where labels don't match
print('Default (NaN for unmatched):')
print(s1 + s2)
# fill_value=0: treat missing as zero
print('\nWith fill_value=0:')
print(s1.add(s2, fill_value=0))Ausrichtung bei arithmetischen DataFrame-Operationen
Die Ausrichtung gilt sowohl für Zeilen als auch für Spalten, wenn zwei DataFrames kombiniert werden. Das Ergebnis enthält die Vereinigung beider Indexmengen und beider Spaltenmengen; überall dort, wo einer der DataFrames keinen Wert hatte, steht NaN. Dies entspricht einem vollständigen Outer Join auf Index und Spalten gleichzeitig. Dadurch können Sie DataFrames aus unterschiedlichen Geschäftsjahreszeiträumen sicher addieren – Monate, die nur in einem der beiden DataFrames vorkommen, erhalten NaN, das Sie anschließend auffüllen oder entfernen können.
import pandas as pd
df1 = pd.DataFrame({'revenue': [100, 200], 'cost': [80, 150]}, index=['Jan', 'Feb'])
df2 = pd.DataFrame({'revenue': [120, 210], 'headcount': [5, 6]}, index=['Feb', 'Mar'])
result = df1 + df2
print('Combined DataFrame (union of index and columns):')
print(result)Die Methode reindex()
df.reindex(new_index) gibt einen neuen DataFrame zurück, der an die Beschriftungsliste new_index angepasst ist. Beschriftungen, die sowohl im ursprünglichen als auch im neuen Index vorkommen, bleiben erhalten; Beschriftungen, die in new_index, aber nicht im ursprünglichen Index vorkommen, erhalten NaN; Beschriftungen, die im ursprünglichen, aber nicht in new_index vorkommen, werden entfernt. Dies ist die explizite Möglichkeit, einen DataFrame vor Operationen an eine vorgegebene Beschriftungsmenge anzupassen.
import pandas as pd
s = pd.Series({'a': 10, 'b': 20, 'c': 30})
# Reindex to a new label set
reindexed = s.reindex(['b', 'c', 'd', 'e'])
print('Original:', s.index.tolist())
print('New index: [b, c, d, e]')
print('\nReindexed Series:')
print(reindexed)
# b, c preserved; d, e → NaN; a droppedFehlende Werte nach der Reindexierung auffüllen
reindex() akzeptiert einen Parameter fill_value, der für neue Beschriftungen eine Konstante einsetzt, sowie einen Parameter method für das Auffüllen in Vorwärtsrichtung ('ffill') oder Rückwärtsrichtung ('bfill'). Diese Auffüllmethoden sind besonders nützlich für Zeitreihendaten, wenn Sie eine Series an einen vollständigen Datumsbereich anpassen und fehlende Tage mit dem zuletzt bekannten Wert statt mit NaN auffüllen möchten.
import pandas as pd
# Sparse daily data with gaps
s = pd.Series(
[10, 20, 30],
index=pd.to_datetime(['2024-01-01', '2024-01-03', '2024-01-07'])
)
# Reindex to complete date range
full_range = pd.date_range('2024-01-01', '2024-01-07')
print('Forward fill (carry last known value):')
print(s.reindex(full_range, method='ffill'))
print('\nFill with 0:')
print(s.reindex(full_range, fill_value=0))Spalten reindexieren
reindex funktioniert auch für Spalten: df.reindex(columns=['col1', 'col2', 'new_col']). Neue Spalten, die im ursprünglichen DataFrame nicht vorhanden sind, werden mit NaN hinzugefügt. Vorhandene Spalten, die nicht in der neuen Liste enthalten sind, werden entfernt. Dies ist nützlich, um über mehrere DataFrames hinweg ein einheitliches Spaltenschema durchzusetzen, wenn diese aus unterschiedlichen Quellen stammen und möglicherweise uneinheitliche Spaltenmengen besitzen.
import pandas as pd
df = pd.DataFrame({
'name': ['Alice', 'Bob'],
'age': [30, 25],
'city': ['NY', 'LA']
})
# Enforce a canonical column order and add missing columns
canonical_cols = ['name', 'age', 'email', 'city', 'country']
df_reindexed = df.reindex(columns=canonical_cols)
print(df_reindexed)
# 'email' and 'country' are new → NaNZwei Objekte mit align() synchronisieren
s1.align(s2) gibt zwei neue Objekte mit demselben Index zurück (Vereinigung oder Schnittmenge, abhängig vom Parameter join), sodass sie für elementweise Operationen bereit sind. Dies entspricht der gleichzeitigen Reindexierung beider Objekte auf dieselbe Beschriftungsmenge. Verwenden Sie join='inner', um nur gemeinsame Beschriftungen beizubehalten, oder join='outer' (Standard), um alle Beschriftungen beider Objekte beizubehalten und bei Abweichungen NaN einzusetzen.
import pandas as pd
s1 = pd.Series({'a': 10, 'b': 20, 'c': 30})
s2 = pd.Series({'b': 1, 'c': 2, 'd': 3})
# Align to common labels only (inner join)
s1_aligned, s2_aligned = s1.align(s2, join='inner')
print('Inner-aligned s1:')
print(s1_aligned)
print('Inner-aligned s2:')
print(s2_aligned)
print('\nProduct on common labels:')
print(s1_aligned * s2_aligned)Ausrichtung bei merge im Vergleich zu Arithmetik
Pandas bietet zwei Vorgehensweisen zum Kombinieren von DataFrames: merge/join (SQL-ähnlich, expliziter Abgleich von Schlüsseln) und Arithmetik mit Indexausrichtung (implizit, beschriftungsbasiert). Verwenden Sie merge, wenn Sie strukturierte Tabellen anhand expliziter Schlüsselspalten kombinieren. Verwenden Sie die arithmetische Ausrichtung für Berechnungen zwischen DataFrames, die natürlicherweise einen gemeinsamen Index haben sollten – beispielsweise beim Subtrahieren eines Kosten-DataFrames von einem Umsatz-DataFrame, die beide nach (Region, Monat) indiziert sind.
import pandas as pd
# Two DataFrames sharing the same index
revenue = pd.Series({'North': 500, 'South': 300, 'East': 450})
costs = pd.Series({'North': 350, 'South': 280, 'West': 400})
# Automatic alignment: 'East' and 'West' don't match → NaN
profit = revenue - costs
print('Profit by region:')
print(profit)
# If you want only common regions
profit_inner = revenue.align(costs, join='inner')[0] - revenue.align(costs, join='inner')[1]
print('\nProfit (common regions only):')
print(profit_inner)Indexgleichheit vor Operationen überprüfen
Überprüfen Sie vor Operationen mit zwei DataFrames, ob ihre Indizes übereinstimmen, mit (df1.index == df2.index).all(). Wenn sich die Indizes nur in ihrer Reihenfolge unterscheiden, sortieren Sie beide vor dem Vergleich. Bei DataFrames aus unterschiedlichen Quellen empfiehlt es sich, sie vor arithmetischen Operationen explizit auszurichten oder zu reindexieren, um eine unbeabsichtigte Weitergabe von NaN zu vermeiden. Dokumentieren Sie Annahmen zur Ausrichtung in Kommentaren oder Pipeline-Protokollen.
import pandas as pd
df1 = pd.DataFrame({'sales': [100, 200, 300]}, index=['Q1', 'Q2', 'Q3'])
df2 = pd.DataFrame({'cost': [80, 160, 240]}, index=['Q1', 'Q2', 'Q3'])
# Check index equality
if (df1.index == df2.index).all():
print('Indices match — safe to combine.')
combined = pd.concat([df1, df2], axis=1)
combined['profit'] = combined['sales'] - combined['cost']
print(combined)
else:
print('Indices differ — align before combining!')Praxisfall: Formen vereinheitlichen
Ein häufig verwendetes Muster beim Laden von Daten aus mehreren Dateien oder API-Aufrufen besteht darin, dass jeder Batch eine andere Teilmenge von Schlüsseln abdeckt. Reindexieren Sie vor dem Verketten oder Aggregieren alle Batches auf den vollständigen bekannten Schlüsselbereich mit fill_value=0. Dadurch haben alle Batches vor den Operationen dieselbe Form (denselben Index und dieselben Spalten), wodurch stille Formabweichungen verhindert werden, die zu falschen aggregierten Ergebnissen führen.
import pandas as pd
# Two sales batches with different product sets
batch1 = pd.Series({'laptop': 50, 'phone': 80, 'tablet': 30})
batch2 = pd.Series({'phone': 90, 'tablet': 40, 'headphones': 60})
# Full product catalogue
all_products = ['laptop', 'phone', 'tablet', 'headphones']
# Standardise both to the full catalogue
b1 = batch1.reindex(all_products, fill_value=0)
b2 = batch2.reindex(all_products, fill_value=0)
total = b1 + b2
print('Total sales per product:')
print(total)Sonderfälle bei der Indexausrichtung
Zwei wichtige Sonderfälle: Doppelte Bezeichnungen – wenn beide Series doppelte Indexbezeichnungen enthalten, führt die Ausrichtung zu einer kartesischen, produktähnlichen Erweiterung mit vielen NaN-Werten (Pandas nimmt nicht an, welche Duplikate einander entsprechen). Stellen Sie vor der arithmetischen Ausrichtung immer eindeutige Indizes sicher. Integer- gegenüber Object-Indizes – ein RangeIndex(0,5) und ein Int64Index([0,1,2,3,4]) werden nach Operationen möglicherweise nicht exakt ausgerichtet, da der eine Index abgeleitet und der andere explizit ist. Verwenden Sie reset_index(drop=True), um sie zu normalisieren.
import pandas as pd
# Duplicate label alignment — produces unexpected expansion
s1 = pd.Series([1, 2, 3], index=['a', 'a', 'b'])
s2 = pd.Series([10, 20], index=['a', 'b'])
result = s1 + s2
print('Result with duplicate indices (unexpected expansion):')
print(result)
print('\nAlways ensure unique indices before arithmetic!')Kurzer Test
Testen Sie Ihr Verständnis der Indexausrichtung und des Reindexierens aus dieser Lektion.
Lektionszusammenfassung
In dieser Lektion haben Sie gelernt: Pandas führt bei arithmetischen Operationen eine automatische Indexausrichtung durch und erzeugt für nicht übereinstimmende Bezeichnungen NaN. reindex() passt einen DataFrame an eine vorgegebene Menge von Bezeichnungen an und bietet Fülloptionen für fehlende Bezeichnungen. align() synchronisiert zwei Objekte gleichzeitig auf denselben Index. Als Nächstes untersuchen wir die Performancevorteile sortierter Indizes und wie sie mit timeit gemessen werden.
Häufig gestellte Fragen
Ist die Lektion „Indexausrichtung und Reindexierung“ kostenlos?
Ja — der vollständige Text von „Indexausrichtung und Reindexierung“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Pandas & NumPy Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Pandas & NumPy Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Indexausrichtung und Reindexierung“?
Richten Sie zwei DataFrames mit reindex() an einem gemeinsamen Index aus, füllen Sie fehlende Labels auf und verstehen Sie, wie arithmetische Operationen Indizes ausrichten. Du übst Pandas & NumPy Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Pandas & NumPy Academy zu starten?
Keine Vorkenntnisse erforderlich. Pandas & NumPy Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.
Wie lange dauert die Lektion „Indexausrichtung und Reindexierung“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Pandas & NumPy Academy-Lektion Code schreiben und ausführen?
Ja. Jede Pandas & NumPy Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Einen MultiIndex erstellen
- Daten aus einem MultiIndex auswählen
- Indexausrichtung und Reindexierung
- Leistungsvorteile sortierter Indizes