Datenaufbereitung mit pandas
MittelEinheit 4 von 8 in Kurs: Datenanalyse mit Python – NumPy, pandas und Matplotlib
Was du lernst
- Erkenne fehlende Werte und doppelte Zeilen in einem pandas-DataFrame, entscheide, ob du sie entfernst, auffüllst oder behältst, und prüfe die Auswirkungen jeder Entscheidung auf die Daten.
- Fehlende Werte in einem DataFrame erkennenErkenne, wie pandas fehlende Daten kennzeichnet, zähle sie pro Spalte und Zeile und finde versteckte Codes, die für fehlende Werte stehen.
- Fehlende Werte entfernen oder auffüllenEntferne unvollständige Zeilen oder Spalten mit dropna oder fülle Lücken mit festen Werten, statistischen Kennwerten, benachbarten Werten oder durch Interpolation und wähle die zu den Daten passende Methode.
- Doppelte Zeilen finden und entfernenMarkiere und entferne wiederholte Zeilen mit duplicated und drop_duplicates, vergleiche bei Bedarf nur Schlüsselspalten und behalte die richtige Kopie jedes Datensatzes.
- Fehlende Werte in einem DataFrame erkennen
- Ändere die Werte einer Spalte kontrolliert: Ersetze Codes, ordne Werte anhand einer Zuordnungstabelle zu, wandle Datentypen um, benenne Bezeichnungen um und wandle Zahlen in Gruppen, skalierte Werte und Indikatorspalten um.
- Werte ersetzen, zuordnen und umwandelnErsetze exakte Werte mit replace, ordne Werte mit map über ein Dictionary oder eine Funktion zu, benenne Zeilen und Spalten um und wandle Text sicher in Zahlen um.
- Werte in Klassen einteilen, skalieren, begrenzen und kodierenTeile Zahlen mit cut und qcut in Intervalle ein, skaliere Spalten, begrenze extreme Werte mit clip und erstelle Indikatorspalten für Kategorien.
- Werte ersetzen, zuordnen und umwandeln
- Vereinheitliche und durchsuche Textspalten mit dem str-Accessor und regulären Ausdrücken und speichere Spalten mit einer festen Auswahl an Werten effizient als kategoriale Daten.
- Textspalten mit Zeichenkettenmethoden bereinigenNutze die vektorisierten str-Methoden, um Text in jeder Zeile einer Spalte gleichzeitig zu kürzen, die Groß- und Kleinschreibung zu ändern, ihn aufzuteilen, zu durchsuchen, zu ersetzen und zu kombinieren.
- Muster mit regulären Ausdrücken erkennen und passende Textteile extrahierenSchreibe einfache reguläre Ausdrücke und nutze sie mit contains, extract, findall und replace, um strukturierte Textteile zu prüfen, zu extrahieren und zu bereinigen.
- Den kategorialen Datentyp nutzenWandle Spalten mit einer begrenzten Auswahl an Werten in kategoriale Daten um, arbeite mit ihren Kategorien und Codes und nutze geordnete Kategorien für Werte mit einer natürlichen Reihenfolge.
- Textspalten mit Zeichenkettenmethoden bereinigen
- Führe Daten aus mehreren Tabellen zusammen: Ordne Zeilen mit merge und join anhand von Schlüsselspalten oder Indexbezeichnungen einander zu, fülle Lücken aus einer zweiten Quelle und füge Tabellen mit concat aneinander.
- DataFrames anhand von Schlüsselspalten verknüpfenKombiniere zwei Tabellen mit merge anhand übereinstimmender Werte in Schlüsselspalten, wähle den Verbundtyp und prüfe das Ergebnis auf nicht zugeordnete und vervielfachte Zeilen.
- Tabellen über den Index verknüpfen und Lücken aus einer anderen Tabelle füllenVerknüpfe Tabellen anhand von Indexbezeichnungen mit join oder left_index und right_index und ergänze fehlende Werte aus einer zweiten Quelle mit combine_first und der Ausrichtung anhand von Indexbezeichnungen.
- DataFrames mit concat aneinanderfügenFüge Tabellen mit pd.concat entlang der Zeilen oder Spalten zusammen, steuere den entstehenden Index und die Spalten und kennzeichne die Herkunft jedes Teils.
- DataFrames anhand von Schlüsselspalten verknüpfen
- Arbeite mit Tabellen, die mehrere Indexebenen haben, und wandle Daten mit stack, unstack, pivot und melt zwischen Lang- und Breitformat um.
- Mit hierarchischen Indizes arbeitenErstelle und lies einen MultiIndex, wähle Daten anhand äußerer und innerer Ebenen aus, ordne und sortiere Ebenen neu und verschiebe Ebenen zwischen Index und Spalten.
- Daten mit stack und unstack umformenVerschiebe Spaltenbezeichnungen mit stack in den Index und Indexebenen mit unstack in die Spalten und behandle fehlende Kombinationen, die beim Umformen sichtbar werden.
- Mit pivot und melt zwischen Lang- und Breitformat wechselnErkenne Lang- und Breitformat, wandle lange Daten mit pivot oder pivot_table in eine breite Tabelle um und eine breite Tabelle mit melt in lange Daten.
- Mit hierarchischen Indizes arbeiten
Datenaufbereitung mit pandas einfach erklärt
1Fehlende Werte und Dubletten erkennen und behandeln
Eine Lücke, eine Null und ein wiederholter Datensatz haben unterschiedliche Bedeutungen. Lerne, fehlende Werte zu quantifizieren, bevor du entscheidest, was du behältst, entfernst oder schätzt, und Dubletten anhand der Spalten zu erkennen, die einen Datensatz definieren. Kleine Wetter- und Bestelltabellen zeigen, wie pandas diese Entscheidungen umsetzt und wie sie sich auf Zeilenanzahl, Datentypen und Kennwerte auswirken. Jede Änderung hat ein sichtbares Ergebnis, das du prüfen kannst, bevor du mit einer Analyse fortfährst.
1.1 Lücken vor dem Rechnen finden
Fehlende Daten bedeuten, dass ein Wert unbekannt oder nicht verfügbar ist. pandas speichert an seiner Stelle ein besonderes Kennzeichen. Erkenne das Kennzeichen, bevor du Summen berechnest oder entscheidest, welche Zeilen nutzbar sind.
Die Kennzeichen erkennen
Das Kennzeichen hängt vom Datentyp ab. Gleitkommaspalten verwenden NaN, Datum-Zeit-Spalten NaT und Datentypen mit Fehlwertunterstützung wie "Int64", "boolean" und "string" verwenden pd.NA. pandas 3 erkennt Textspalten als str, mit NaN für fehlenden Text. Auch Pythons None wird als fehlend erkannt. Nutze für die Beispiele import pandas as pd und import numpy as np.
df.isna() erzeugt eine boolesche Tabelle mit denselben Zeilen und Spalten wie df. Ein True markiert eine Lücke; df.notna() markiert vorhandene Werte. Die alternativen Namen isnull() und notnull() erfüllen dieselben Aufgaben. Vergleiche eine Spalte nicht mit np.nan: NaN ist selbst sich selbst nicht gleich, daher übersieht s == np.nan die Lücken.
Zellen und betroffene Zeilen zählen
Betrachte diese Wettermesswerte:
| city | temp_c | rain_mm |
|---|---|---|
| Lima | 18,0 | 0,0 |
| Oslo | NaN | 4,0 |
| Pune | 31,0 | NaN |
| Kyiv | NaN | NaN |
Ein boolesches True zählt als 1, daher ergibt df.isna().sum() 0 fehlende Städte, 2 Temperaturen und 2 Niederschlagsmesswerte. df.isna().mean() ergibt die Anteile 0,0, 0,5 und 0,5. Für den Anteil jeder Spalte dienen alle vier Zeilen als Nenner.
Um betroffene Zeilen zu finden, nutze df.isna().any(axis=1). Der Aufruf gibt False, True, True, True zurück; die Summe ergibt 3. Dagegen ergibt df.isna().sum().sum() 4 fehlende Zellen. Kyiv trägt zwei Zellen, aber nur eine betroffene Zeile bei. Nutze die Kennzahl, die deine Frage beantwortet.
Versteckte Fehlwertcodes erkennen
Ein Messgerät kann einen nicht verfügbaren Messwert als -999, "-" oder "unknown" erfassen. Das sind gewöhnliche Werte, bis du sie umwandelst. Nachdem du die Bedeutung des Codes bestätigt hast, nutze df.replace([-999, "unknown"], np.nan). Beim Laden einer CSV-Datei fügt na_values=[-999, "unknown"] diese Codes zu den erkannten Kennzeichen hinzu. Leere CSV-Felder und häufige Zeichenketten wie "NA", "n/a" und "NULL" werden standardmäßig bereits erkannt.
Ein Niederschlagsmesswert von null kann bedeuten, dass kein Regen gefallen ist. Daher würde das Ersetzen jeder Null echte Beobachtungen zerstören. Außerdem gelten eine im Speicher erstellte leere Zeichenkette "" und eine Zeichenkette aus Leerzeichen für isna() nicht als fehlend. Untersuche den gespeicherten Text ebenso wie die Anzahl der Kennzeichen. Um fehlende Kategorien in eine Häufigkeitstabelle aufzunehmen, nutze value_counts(dropna=False).
Berechnungen und Datentypen prüfen
Für s = pd.Series([4, np.nan, 8]) ist s.mean() gleich 6,0: Der Aufruf nutzt die zwei bekannten Werte. s.count() ist 2, während len(s) gleich 3 ist. Dividierst du s.sum() durch len(s), erhältst du 4,0 und behandelst die Lücke fälschlich als null. Die meisten statistischen Methoden überspringen Lücken standardmäßig; eine Spalte, deren Werte alle fehlen, hat die Summe 0, aber den Mittelwert NaN.
Eine Lücke kann auch die Speicherung ändern. pd.Series([3, None, 5]) wird zu float64 und enthält 3,0, NaN und 5,0. Die Angabe dtype="Int64" behält ganzzahlige Werte bei und setzt <NA> für die Lücke. Das große I kennzeichnet den pandas-Ganzzahldatentyp mit Fehlwertunterstützung.
Wichtige Erkenntnisse
- Nutze
isna(), um Fehlwertkennzeichen in verschiedenen Datentypen zu erkennen. - Zähle fehlende Zellen getrennt von Zeilen mit mindestens einer Lücke.
- Wandle bestätigte Fehlwertcodes um; erhalte gültige Nullen.
- Prüfe, wie viele bekannte Werte in einen Kennwert eingehen.
- Nutze
"Int64", wenn ganzzahlige Werte ein Fehlwertkennzeichen benötigen.
1.2 Entscheiden, was entfernt oder aufgefüllt wird
Wenn du eine Zeile entfernst, entfernst du ihre bekannten Werte zusammen mit ihren Lücken. Füllst du eine Lücke auf, bleibt die Zeile erhalten, aber du führst eine Schätzung ein. Entscheide anhand der Bedeutung der Beobachtung und der Spalten, die die Analyse benötigt.
Steuern, welche Zeilen entfernt werden
df.dropna() entfernt jede Zeile mit einem fehlenden Wert. In der Wettertabelle bleibt nur Lima. Schränke die Entscheidung mit subset ein oder verlange mit thresh eine Mindestanzahl vorhandener Zellen.
| Aufruf | Behaltene Zeilen | Grund |
|---|---|---|
df.dropna(subset=["temp_c"]) | Lima, Pune | Temperatur ist vorhanden |
df.dropna(thresh=2) | Lima, Oslo, Pune | Mindestens zwei Zellen sind vorhanden |
df.dropna(how="all") | Alle vier | Jede Zeile hat eine Stadt |
axis="columns" entfernt Spalten mit Lücken und behält hier nur city. Bei einer breiten Tabelle kann die standardmäßige Regel für Zeilen einen großen Teil der Daten verwerfen, weil eine Lücke in einer beliebigen Spalte genügt. Vergleiche len(df) vor und nach dem Entfernen.
Das Ergebnis zuweisen
Lerne die Form mit erneuter Zuweisung: df = df.dropna(). Standardmäßig geben Bereinigungsmethoden ein neues Objekt zurück. pandas 3.1 stuft inplace=True unter anderem für die Methoden dropna, drop_duplicates und rename als veraltet ein.
Für eine Spalte schreibe df["temp_c"] = df["temp_c"].fillna(0). Ein verketteter Aufruf wie df["temp_c"].fillna(0, inplace=True) aktualisiert unter Copy-on-Write in pandas 3 nie den übergeordneten DataFrame. Die Zuweisung macht das Ziel ausdrücklich sichtbar.
Mit einem kompatiblen Wert auffüllen
Ein Dictionary mit Werten pro Spalte ermöglicht es, eine gemischte Tabelle mit passenden Werten aufzufüllen: df.fillna({"rain_mm": 0, "city": "Unknown"}). Spalten, die im Dictionary fehlen, behalten ihre Lücken. Ein Skalar wie 0 ist praktisch für eine rein numerische Tabelle, deren Spalten ihn alle annehmen. Text mit einer Zahl aufzufüllen ist nicht kompatibel; pandas 3.1 warnt davor und eine zukünftige Version wird es ablehnen.
Die bekannten Temperaturen sind 18,0 und 31,0. Ihr Mittelwert ist 24,5, daher setzt df["temp_c"].fillna(df["temp_c"].mean()) 24,5 in beide Lücken ein. Ein extremer Wert kann den Mittelwert stark verschieben; ein Median reagiert weniger empfindlich. Halte vor dem Auffüllen mit df["temp_missing"] = df["temp_c"].isna() einen Indikator fest, damit geschätzte und beobachtete Werte unterscheidbar bleiben.
Die Mittelwertimputation verringert die scheinbare Streuung der Spalte. Ein weit entfernter fester Wert kann sie erhöhen. Niederschlagswerte mit 0 aufzufüllen, besagt, dass kein Regen gefallen ist. Das ist bei einem ausgeschalteten Sensor unangemessen.
Benachbarte Messwerte nutzen, wenn die Reihenfolge zählt
ffill() übernimmt den letzten bekannten Wert vorwärts; bfill() übernimmt den nächsten bekannten Wert rückwärts. Für 12,0, NaN, NaN, NaN, 15,0 ergibt das Vorwärtsauffüllen vier Werte von 12,0, gefolgt von 15,0. ffill(limit=1) füllt nur die erste Lücke in dieser Folge. Eine Lücke am Anfang hat keinen vorherigen Wert und bleibt bestehen. Nutze ffill() direkt; fillna(method="ffill") wurde in pandas 3 entfernt.
interpolate() schätzt zwischen benachbarten Positionen. Für 10, NaN, NaN, 16 ergibt lineare Interpolation 10, 12, 14, 16. Sie eignet sich für Messwerte, die sich in einer sinnvollen Reihenfolge stetig ändern. Das Übernehmen oder Interpolieren über nicht zusammengehörige Städte hinweg würde eine Beziehung unterstellen, die zwischen den Zeilen nicht besteht.
Führe nach jeder Operation isna().sum() erneut aus und prüfe die Zeilenanzahl. Ein erfolgreicher Methodenaufruf sagt dir, dass der Code ausgeführt wurde; diese Prüfungen zeigen dir, was sich geändert hat.
Wichtige Erkenntnisse
- Nutze
subset,howoderthresh, um anzugeben, welche Lücken wichtig sind. - Weise die zurückgegebenen Ergebnisse dem DataFrame oder der Spalte zu, die du ändern möchtest.
- Wähle Füllwerte, die sowohl zum Datentyp der Spalte als auch zur Bedeutung der Lücke passen.
- Halte vor dem Auffüllen mit geschätzten Werten einen Fehlwertindikator fest.
- Nutze Methoden mit benachbarten Werten nur, wenn die Reihenfolge der Zeilen sinnvoll ist.
- Prüfe nach der Bereinigung die Zeilenanzahl und die Anzahl fehlender Werte.
1.3 Den Datensatz bestimmen, bevor du seine Kopien entfernst
Zwei Zeilen können ähnlich aussehen, ohne dass sie dasselbe Ereignis beschreiben. Entscheide vor dem Entfernen von Dubletten, welche Werte einen Datensatz identifizieren. Eine Bestell-ID kann eine Bestellung identifizieren; Kunde und Datum allein können mehrere tatsächliche Käufe bezeichnen.
Die zusätzlichen Kopien markieren
df.duplicated() gibt pro Zeile einen booleschen Wert zurück. Standardmäßig vergleicht die Methode jede Spalte, behält das erste Vorkommen und markiert spätere Kopien mit True. Die Summe des Ergebnisses zählt zusätzliche Kopien, nicht alle Mitglieder wiederholter Gruppen.
Betrachte sechs Bestellzeilen mit den IDs 101, 102, 102, 103, 104, 104. Die beiden Zeilen mit 102 sind identisch. Die beiden Zeilen mit 104 haben unterschiedliche erfasste Gewichte, 0,5 kg und 0,8 kg. Werden alle Spalten verglichen, gibt es eine zusätzliche Kopie: df.duplicated().sum() ist 1. df.drop_duplicates() behält fünf Zeilen, weil die beiden unterschiedlichen Zeilen mit 104 keine exakten Kopien sind.
Die Spalten vergleichen, die die Identität bestimmen
df.duplicated(subset=["order_id"]) vergleicht nur die IDs. Die Methode markiert die zweite 102 und die zweite 104 und ergibt damit zwei zusätzliche Kopien. Die Werte der anderen Spalten beeinflussen diese Entscheidung nicht mehr. Untersuche die widersprüchlichen Gewichte, bevor du entscheidest, welchen Bestelldatensatz du behältst.
keep-Wert | Verhalten bei einer wiederholten Gruppe |
|---|---|
"first" | Erste Zeile in der aktuellen Reihenfolge behalten |
"last" | Letzte Zeile in der aktuellen Reihenfolge behalten |
False | Jedes Mitglied einer wiederholten Gruppe entfernen |
df.drop_duplicates(subset="order_id", keep="last") behält bei dieser Reihenfolge die Version mit 0,8 kg für Bestellung 104. Die letzte Zeile zu behalten bedeutet nicht von selbst, den neuesten Datensatz zu behalten. Stelle diese Reihenfolge zuerst her:
latest = df.sort_values("updated").drop_duplicates(
subset="customer_id", keep="last"
)
Das Sortieren nach updated setzt ältere Datensätze vor neuere. Die Dublettenprüfung vergleicht dann nur customer_id, sodass unterschiedliche Aktualisierungszeitpunkte nicht verhindern, dass zwei Zeilen als Versionen desselben Kunden erkannt werden.
Zeilenwerte von Indexbezeichnungen unterscheiden
Diese Methoden vergleichen Werte und ignorieren Indexbezeichnungen. Identische Zeilen mit den Bezeichnungen 4 und 9 zählen weiterhin als Dubletten. Fehlende Werte an entsprechenden Positionen gelten bei dieser Prüfung als gleich. Um wiederholte Bezeichnungen selbst zu prüfen, nutze df.index.duplicated().
Der exakte Vergleich unterscheidet auch Groß- und Kleinschreibung sowie Leerraumzeichen. Die Werte „ Lisbon“, „lisbon“ und „LISBON “ sind unterschiedlich. Bereinige sie vor der Dublettenprüfung mit .str.strip().str.lower(), wenn diese Schreibweisen dieselbe Stadt bezeichnen. Andernfalls zählt nunique() drei Namen für einen Ort.
Eindeutigkeit dort prüfen, wo die Beziehung sie verlangt
Eine Zuordnungstabelle sollte eine Zeile pro Zuordnungsschlüssel enthalten, wenn jeder Datensatz einen Satz von Angaben erhalten muss. lookup["customer_id"].is_unique prüft diese Anforderung. Wiederholte Kunden-IDs in einer Bestelltabelle sind normal, weil ein Kunde mehrere Bestellungen aufgeben kann.
Wiederholt sich ein Zuordnungsschlüssel, wiederholt ein späterer Verbund jede passende Bestellung für jede passende Zeile der Zuordnungstabelle. Das Entfernen von Dubletten aus den Bestellungen würde echte Käufe verwerfen, ohne die Zuordnungstabelle zu korrigieren. Prüfe den vorgesehenen Schlüssel in der richtigen Tabelle, untersuche widersprüchliche Datensätze und vergleiche die Zeilenanzahl nach dem Entfernen.
Wichtige Erkenntnisse
- Definiere einen Datensatz anhand der richtigen Schlüsselspalten, bevor du Kopien entfernst.
duplicated().sum()zählt mit der Standardeinstellungkeep="first"spätere Kopien.- Sortiere nach dem Aktualisierungszeitpunkt, bevor du den neuesten Datensatz behältst.
- Doppelte Zeilenwerte und wiederholte Indexbezeichnungen werden getrennt geprüft.
- Eindeutige Zuordnungsschlüssel verhindern eine versehentliche Vervielfachung von Zeilen bei Verbunden.
2Werte durch Ersetzen, Zuordnen und Klasseneinteilung transformieren
Die Transformation einer Spalte ändert, was ihre Werte bedeuten oder wie sie dargestellt werden. Wähle zwischen exaktem Ersetzen, Zuordnen, numerischer Umwandlung, Intervallen, skalierten Werten und Indikatorspalten. Du untersuchst die Eingaben und Ausgaben jeder Methode, einschließlich dessen, was mit Werten ohne Zuordnung und mit Grenzwerten geschieht. So verändert eine praktische Operation nicht unbemerkt Kategorien oder führt zum Verlust nutzbarer Messwerte.
2.1 Werte und Bezeichnungen gezielt ändern
Eine Ersetzung ändert passende Werte, eine Zuordnung übersetzt Werte und eine Umbenennung ändert Bezeichnungen. Im Code können diese Aufgaben ähnlich aussehen, sie liefern aber unterschiedliche Ergebnisse, wenn ein Wert in einem Dictionary fehlt.
Exakte Werte ersetzen
s.replace("N/A", np.nan) ändert nur Zellen, die "N/A" entsprechen. Eine Liste kann mehrere alte Werte nennen: s.replace(["-", "?"], np.nan). Ein Dictionary gibt für jeden Wert eine eigene Ersetzung an, etwa s.replace({"M": "male", "F": "female"}). Werte ohne Übereinstimmung bleiben unverändert.
Für eine ganze Tabelle beschränkt ein verschachteltes Dictionary die Änderung auf eine Spalte: df.replace({"status": {0: "open", 1: "closed"}}). So vermeidest du, dass andere Nullen und Einsen an anderer Stelle geändert werden. Weise das zurückgegebene Ergebnis zu, um die Änderung zu behalten.
replace gleicht ganze Zellen ab. Bei „Main St“ und „St“ ändert s.replace("St", "Street") nur „St“. Um Teile einer Zeichenkette zu ändern, nutze s.str.replace("St", "Street", regex=False), das auch „Main Street“ erzeugt.
Mit einer Zuordnung Werte übersetzen
Vergleiche für die Codes „PT“, „JP“ und „KE“ dasselbe Dictionary in zwei Methoden:
| Methode | PT | JP | KE |
|---|---|---|---|
s.map({"PT": "Portugal", "JP": "Japan"}) | Portugal | Japan | NaN |
s.replace({"PT": "Portugal", "JP": "Japan"}) | Portugal | Japan | KE |
Ein an map übergebenes Dictionary legt die möglichen Ausgaben fest. Ein fehlender Schlüssel hat keine Ausgabe und wird zu einem fehlenden Wert. Prüfe anschließend isna().sum(), damit eine unvollständige Zuordnung sichtbar wird.
map akzeptiert auch eine Funktion: s.map(lambda x: x * 1000) wandelt Kilometerwerte in Meter um. Für diese Rechnung ist s * 1000 einfacher und schneller, weil der Ausdruck auf die ganze Spalte wirkt. DataFrame.map wendet eine Funktion Zelle für Zelle an; es ersetzt die entfernte Methode applymap.
Text in Zahlen umwandeln
astype fordert einen Datentyp an, etwa "float64", "Int64" oder "category". Die Methode löst einen Fehler aus, wenn ein Wert nicht umgewandelt werden kann. Für den Text "12", "7.5" und "n/a" erzeugt pd.to_numeric(s, errors="coerce") dagegen 12,0, 7,5 und NaN. Die Typumwandlung mit Fehlerersetzung erhält lesbare Zahlen, verlangt aber, dass du die fehlgeschlagenen Umwandlungen untersuchst.
Die Formatierung kann eine Umwandlung verhindern, selbst wenn die Zahl gültig ist. Entferne für „1,200“ und „950“ zuerst das Tausendertrennzeichen:
cleaned = s.str.replace(",", "", regex=False)
numbers = pd.to_numeric(cleaned, errors="coerce")
failed = s.notna() & numbers.isna()
Hier markiert failed Werte, die vor der Umwandlung vorhanden waren, danach aber fehlten. Der alleinige Vergleich der Anzahl fehlender Werte liefert eine nützliche Gesamtzahl; die Maske zeigt zusätzlich, wo der ursprüngliche Text zur Prüfung steht. Entferne bekannte Einheiten aus Messtexten vor der Umwandlung ebenso gezielt.
Die Bezeichnungen umbenennen
df.rename(columns={"Qty": "quantity"}) ändert eine Spaltenüberschrift und lässt ihre Zellen unverändert. df.rename(columns=str.lower) schreibt alle Überschriften klein. Eine Folge wie df.columns.str.strip().str.lower().str.replace(" ", "_", regex=False) macht aus „Total KG “ den Namen total_kg; weise sie df.columns zu.
Nutze replace oder map für Werte innerhalb einer Spalte. Nutze rename für die Bezeichnungen, anhand derer du diese Werte auswählst.
Wichtige Erkenntnisse
replacebehält Werte ohne Übereinstimmung;mapmit einem Dictionary macht sie zu fehlenden Werten.- Nutze
.str.replace, um einen Teil jedes Textwerts zu ändern. - Bevorzuge vektorisierte Arithmetik für einfache Berechnungen in Spalten.
- Untersuche neu entstandene fehlende Werte nach einer numerischen Typumwandlung mit Fehlerersetzung.
renameändert Bezeichnungen und lässt Datenwerte unverändert.
2.2 Messwerte gruppieren und neu skalieren
Manche Analysen benötigen exakte Messwerte, andere Gruppen oder vergleichbare numerische Bereiche. Halte die ursprüngliche Bedeutung klar: Die Klasseneinteilung erzeugt Kategorien, die Skalierung ändert die numerische Skala und die Wertbegrenzung ersetzt extreme Werte.
Werte in Intervalle einteilen
pd.cut(ages, [18, 30, 45, 65]) verwendet die Intervalle (18, 30], (30, 45] und (45, 65]. Die runde Klammer schließt den linken Endpunkt aus; die schließende eckige Klammer schließt den rechten Endpunkt ein. Die Alterswerte 19, 25 und 30 gelangen in das erste Intervall, 41 in das zweite und 64 in das dritte. Der Alterswert 18 wird zu einem fehlenden Wert, weil er auf der ausgeschlossenen linken Grenze liegt.
include_lowest=True nimmt diesen niedrigsten Wert in das erste Intervall auf. right=False erzeugt dagegen links abgeschlossene Intervalle wie [18, 30), sodass 30 in das zweite Intervall gelangt. Werte außerhalb aller Intervalle bleiben fehlend. Teste sowohl die genauen Grenzen als auch typische Werte dazwischen.
Es muss eine Bezeichnung pro Intervall geben, also eine weniger als die Anzahl der Grenzen. Mit labels=["18-30", "31-45", "46-65"] und include_lowest=True ergeben die sechs obigen Alterswerte die Anzahlen 4, 1 und 1. Diese Bezeichnungen beschreiben ganzzahlige Alterswerte; die Intervallgrenzen bestimmen weiterhin die Zuordnung.
Grenzen oder Gruppengrößen wählen
| Operation | Was sie steuert | Nützlicher Zweck |
|---|---|---|
pd.cut(x, [18, 30, 45, 65]) | Feste Grenzen | Aussagekräftige Bereiche |
pd.cut(x, 4) | Vier gleich breite Intervalle | Wertebereiche vergleichen |
pd.qcut(x, 4) | Vier Gruppen mit etwa gleicher Anzahl | Rangplätze in den Daten vergleichen |
Für 2, 4, 6, 8, 10, 12, 14, 16 ergibt qcut zwei Werte pro Quartilgruppe. Gruppen mit gleicher Besetzungszahl müssen nicht gleich breite Zahlenbereiche abdecken.
Skalieren, ohne Gruppen zu erzeugen
Die Min-Max-Skalierung nutzt (x - x.min()) / (x.max() - x.min()). Für 10, 20, 40 beträgt die Spannweite 30: Die Ergebnisse sind 0, etwa 0,333 und 1. Sowohl das Minimum als auch das Maximum werden benötigt; allein durch das Maximum zu dividieren ist eine andere Operation. Eine konstante Spalte hat die Spannweite null, sodass dieser Ausdruck keine sinnvolle skalierte Streuung liefern kann.
Die Standardisierung nutzt (x - x.mean()) / x.std(). Für 10, 20, 30 ist der Mittelwert 20 und die standardmäßig von pandas berechnete Stichprobenstandardabweichung 10. Subtrahierst du 20 und dividierst durch 10, erhältst du die z-Werte -1, 0 und 1. Ein z-Wert beschreibt den Abstand vom Mittelwert in Einheiten der Standardabweichung, keine Intervallbezeichnung.
Begrenzen und kodieren
pd.Series([5, 12, 250, 8]).clip(upper=100) ergibt 5, 12, 100, 8. Anders als ein Filter behält clip die Zeile und ersetzt die extreme Zahl. Untersuche große Werte vor dem Begrenzen mit describe() oder einem Filter: Auch ein echter großer Messwert ist ein Datenwert.
pd.get_dummies(s) erstellt eine boolesche Indikatorspalte pro Kategorie. Bei Rot, Grün, Rot, Blau ist jede Zeile nur in der Spalte ihrer Farbe True. Nutze dtype=int für Nullen und Einsen. Fehlende Werte ergeben durchweg falsche Indikatorwerte, sofern dummy_na=True keine Spalte für fehlende Werte hinzufügt. Für eine gewöhnliche Kleinste-Quadrate-Regression mit Achsenabschnitt entfernt drop_first=True eine redundante Kategoriespalte; andere Modelle können alle Kategorien behalten. Bei einer Kategorie pro Zeile summiert sich der vollständige Satz von Indikatoren zur Konstanten 1 des Achsenabschnitts und erzeugt eine lineare Abhängigkeit.
Bei Zellen mit mehreren Schlagwörtern teilt s.str.get_dummies(sep="|") einen Wert wie „Action|Comedy“ in separate Indikatoren auf. Auch die Intervalle einer Klasseneinteilung lassen sich an get_dummies übergeben, sodass eine Spalte pro Bereich entsteht.
Wichtige Erkenntnisse
- Prüfe bei
cutdie Intervallendpunkte und Werte außerhalb der Bereiche. cutsteuert die Wertebereiche;qcutzielt auf ähnliche Gruppenanzahlen ab.- Min-Max-Skalierung und z-Werte erhalten numerische Werte auf einer veränderten Skala.
clipbegrenzt Werte, ohne Zeilen zu entfernen.- Indikatorspalten stellen die Zugehörigkeit zu Kategorien dar, ohne eine numerische Reihenfolge zu erfinden.
- Behandle fehlende Kategorien ausdrücklich, wenn ihre Indikatoren wichtig sind.
3Textdaten und kategoriale Daten bereinigen
Textwerte brauchen eine einheitliche Schreibweise und einheitliche Leerzeichen, bevor sie als Kategorien oder Schlüssel dienen können. Wende Zeichenkettenmethoden auf eine Spalte an, extrahiere strukturierte Teile mit regulären Ausdrücken und wähle einen kategorialen Datentyp, wenn sich wenige Bezeichnungen wiederholen. Die Beispiele verbinden Textbereinigung mit Dublettenprüfungen und Verbunden und zeigen, wie sich gespeicherte Codes und die Kategorienreihenfolge von den Wörtern unterscheiden, die Lernende in einer Tabelle sehen.
3.1 Textwerte vereinheitlichen
Ein Mensch erkennt in „ Lisbon“, „lisbon“ und „LISBON “ dieselbe Stadt. pandas sieht drei verschiedene Zeichenketten. Durch das Bereinigen einer Textspalte erhalten spätere Zählungen, Dublettenprüfungen und Verbunde einheitliche Werte zum Vergleichen.
Zeichenkettenmethoden auf eine Series anwenden
Pythons "Lima ".strip() arbeitet mit einer Zeichenkette. Nutze für eine Spalte den .str-Accessor: s.str.strip() entfernt äußere Leerraumzeichen aus jedem nicht fehlenden Wert. s.lower() löst einen AttributeError aus, weil die Series selbst keine Methode lower hat. Nutze s.str.lower().
pandas 3 erkennt Text normalerweise als Datentyp str, der die ältere Standardeinstellung object ersetzt. Der Datentyp str enthält Text und fehlende Werte, wobei NaN für fehlenden Text steht. Zeichenkettenmethoden funktionieren bei beiden Typen. Weise einer str-Spalte Text zu; wandle eine Zahl zuerst in Text um, wenn sie dort als Text hingehört.
Kombiniere passende Bereinigungsoperationen und weise das Ergebnis zu:
df["city"] = df["city"].str.strip().str.lower()
Die drei Schreibweisen von Lissabon werden zu „lisbon“. strip() entfernt äußere Leerraumzeichen, keine Leerzeichen innerhalb eines Namens. upper() schreibt alle Buchstaben groß, während title() jedes Wort am Anfang großschreibt und aus „new york“ „New York“ macht. Wähle für Schlüssel und Zählungen eine einheitliche Form.
Strukturierte Zeichenketten aufteilen
Für „Silva, Ana“ und „Tanaka, Yui“ gibt s.str.split(", ") Listen wie ["Silva", "Ana"] zurück. Füge expand=True hinzu, um separate Spalten zu erzeugen. Hole mit .str[0] oder .str.get(1) einen Teil aus jeder Liste.
Soll nur das erste Trennzeichen einen Wert aufteilen, nutze n=1. Das Aufteilen von „a,b,c“ an Kommas mit n=1 ergibt „a“ und „b,c“. Ohne Begrenzung ergeben sich drei Teile. Gleiche das Trennzeichen exakt ab, einschließlich jedes Leerzeichens, das zum Format gehört.
Suchen und filtern
s.str.contains("lis", case=False) prüft, ob Text irgendwo vorkommt, und ignoriert dabei die Groß- und Kleinschreibung. s.str.startswith("ID") prüft den Anfang; s.str.endswith(".csv") prüft das Ende. Die booleschen Ergebnisse können Zeilen auswählen:
mask = df["city"].str.contains("san", case=False, na=False)
selected = df[mask]
Beim Datentyp str in pandas 3 ergibt fehlender Text in diesen Suchtests False. Die Angabe na=False macht auch bei der Verwendung von Zeichenkettendaten mit Fehlwertunterstützung die beabsichtigte Behandlung deutlich. contains liest standardmäßig ein Regex-Muster; ergänze regex=False für wörtlich zu suchenden Text mit Sonderzeichen.
Teile ersetzen und neue Zeichenketten bilden
s.str.replace("kg", "", regex=False) entfernt „kg“, wo immer es vorkommt. s.replace("kg", "") ändert nur Zellen, die genau „kg“ enthalten. Dieser Unterschied ist bei Werten wie „12 kg“ wichtig.
str.replace behandelt seinen Suchtext standardmäßig wörtlich. Für „3.5 kg“ entfernt .str.replace(".", "", regex=False) den Punkt und ergibt „35 kg“. Mit regex=True steht der Punkt als Muster für fast jedes Zeichen und entfernt in diesem einzeiligen Beispiel alle Zeichen. Nutze diese Änderung niemals, um einen dezimalen Messwert einzulesen.
s.str.len() zählt Zeichen; ein fehlender Wert ergibt NaN und kann das Ergebnis zu einer Gleitkommaspalte machen. s.str[:3] extrahiert die ersten drei Zeichen. Um Spalten zu kombinieren, verbindet df["first"] + " " + df["last"] Ana und Silva zu „Ana Silva“; str.cat ist eine weitere Methode zum Verbinden. Jede Operation gibt ein Ergebnis zurück, speichere es daher in der Spalte, die du verwenden möchtest.
Wichtige Erkenntnisse
- Nutze
.str, um Textmethoden auf eine Series anzuwenden. - Entferne äußere Leerraumzeichen und vereinheitliche die Groß- und Kleinschreibung, bevor du Textschlüssel abgleichst.
- Steuere die Ausgabe beim Aufteilen mit
expandundn. - Wähle bei Sonderzeichen ausdrücklich zwischen wörtlicher Suche und Suche mit regulären Ausdrücken.
- Weise bereinigten Text wieder zu, um die Änderung zu behalten.
3.2 Die Teile extrahieren, die ein Textmuster beschreibt
Ein regulärer Ausdruck, auch Regex genannt, beschreibt ein Muster in Text. Er kann eine Mengenangabe erkennen, selbst wenn die Anzahl der Ziffern oder die Abstände variieren. Beginne mit einem kleinen Muster, dessen Teile du erklären kannst.
Die Musterbestandteile lesen
| Muster | Bedeutung |
|---|---|
\d | Eine Ziffer |
\w | Ein Wortzeichen: ein Buchstabe, eine Ziffer oder ein Unterstrich |
\s | Ein Leerraumzeichen |
[A-Z] | Ein Großbuchstabe aus diesem Bereich |
+ | Das vorherige Element ein- oder mehrmals |
* | Das vorherige Element null- oder mehrmals |
? | Das vorherige Element ist optional |
{4} | Genau vier Wiederholungen |
(…) | Eine Erfassungsgruppe |
Schreibe Python-Muster als Raw-Strings wie r"\d+", damit Python ihre umgekehrten Schrägstriche beibehält. Ein Punkt passt standardmäßig auf jedes Zeichen außer einem Zeilenumbruch. Maskiere ihn als r"\.", um einen tatsächlichen Punkt zu finden. Für eine einfache Textsuche verhindert regex=False die Interpretation als Muster vollständig.
Festlegen, wie viel Text passen muss
contains findet ein Muster an beliebiger Stelle, match beginnt am Anfang und fullmatch verlangt, dass der gesamte Wert passt. Für „123a“ sind s.str.contains(r"\d+") und s.str.match(r"\d+") erfolgreich, aber s.str.fullmatch(r"\d+") schlägt fehl. Nutze die Prüfung der gesamten Zeichenkette, wenn du einen vollständigen Code prüfst. case=False oder flags=re.IGNORECASE nach import re ermöglicht, wo unterstützt, einen Abgleich ohne Beachtung der Groß- und Kleinschreibung.
Einen Messwert erfassen
Nimm „Rice 5 kg“, „Flour 2kg“, „Salt“ und „Beans 12 kg, 3 kg“. Das Muster r"(\d+)\s*kg" bedeutet eine oder mehrere Ziffern, die als Gruppe erfasst werden, gefolgt von null oder mehr Leerzeichen und dann „kg“.
quantity = s.str.extract(r"(\d+)\s*kg", expand=False)
quantity = pd.to_numeric(quantity)
Die extrahierten Zeichenketten sind „5“, „2“, ein fehlender Wert und „12“. Die Umwandlung ergibt die numerischen Werte 5,0, 2,0, NaN und 12,0. extract nimmt die erste Übereinstimmung jeder Zeile, sodass die zweite Mengenangabe in der Bohnenbeschreibung nicht enthalten ist. Ohne expand=False gibt eine einzelne Gruppe einen DataFrame mit einer Spalte zurück.
Benannte Gruppen beschriften die Ausgabe. s.str.extract(r"(?P<year>\d{4})-(?P<month>\d{2})") findet „2024-03“ in „Report 2024-03 final“ und gibt die Textspalten year und month zurück. Das Muster erkennt die Anordnung der Ziffern; die numerische Umwandlung ist ein separater Schritt.
Alle Übereinstimmungen finden oder nach Muster bereinigen
findall(r"\d+") ergibt pro Zeile eine Liste, darunter ["12", "3"] für den Bohnentext und [] für „Salt“. count(r"\d+") zählt Übereinstimmungen. extractall ergibt eine Zeile pro Übereinstimmung mit einer zusätzlichen Indexebene namens match.
Mit regex=True reduziert s.str.replace(r"\s+", " ", regex=True) Folgen von Leerraumzeichen auf ein Leerzeichen. r"\D" steht für ein Zeichen, das keine Ziffer ist. Entfernst du es, wird aus „+351 912-345-678“ die Zeichenkette „351912345678“. Die Großbuchstabenformen \S und \W verneinen entsprechend die Klassen der Leerraumzeichen und Wortzeichen.
Wiederholungen sind standardmäßig gierig. In "<b>x</b>" reicht r"<.*>" vom ersten öffnenden bis zum letzten schließenden Zeichen. Das Entfernen dieser Übereinstimmung entfernt alles. Das nicht gierige Muster r"<.*?>" erfasst jedes Tag einzeln und lässt „x“ stehen. Prüfe Beispielausgaben, bevor du ein Muster auf eine ganze Spalte anwendest.
Wichtige Erkenntnisse
- Nutze Raw-Strings, damit die umgekehrten Schrägstriche in regulären Ausdrücken erhalten bleiben.
- Wähle
contains,matchoderfullmatchfür den gewünschten Suchbereich. - Erfassungsgruppen geben Text zurück; wandle extrahierte Zahlen separat um.
extractnimmt die erste Übereinstimmung;findallundextractallbehalten mehrere Übereinstimmungen.- Maskiere Sonderzeichen für wörtliche Übereinstimmungen in regulären Ausdrücken.
- Prüfe gierige Muster anhand von Beispielen mit mehreren möglichen Übereinstimmungen.
3.3 Wiederholte Bezeichnungen als Kategorien speichern
Eine Spalte mit wenigen Werten, die sich oft wiederholen, kann den Datentyp category verwenden. Dabei werden die unterschiedlichen Bezeichnungen einmal gespeichert und jede Zeile durch einen kleinen Ganzzahlcode dargestellt. Der sichtbare Wert bleibt die Bezeichnung.
Kategorien und Codes verstehen
Für die Größen M, S, L, M, M ermittelt s.astype("category") die Kategorien L, M, S in alphabetischer Reihenfolge. Die Codes sind 1, 2, 0, 1, 1. Nutze s.cat.categories, um die Bezeichnungen zu prüfen, und s.cat.codes, um die Kennungen zu prüfen. Ein Code von 0 bezeichnet die erste gespeicherte Kategorie; er ist keine gemessene Größe.
Bei wiederholten Bezeichnungen lässt sich viel Speicher sparen. Bis zu 126 Kategorien benötigen die Codes jeweils ein Byte; ab 127 Kategorien benötigen sie zwei Bytes. In einer pandas-3.1-Umgebung mit PyArrow benötigten drei Ländernamen, die sich über 3.000.000 Zeilen wiederholten, etwa 3 MB als kategoriale Daten, etwa 42 MB als str und etwa 165 MB als object. Das verwendete Backend für die Textspeicherung beeinflusst diese Zahlen. Bei einer Spalte mit fast ausschließlich eindeutigen Werten bringt es keinen Vorteil, eine Kategorienliste und einen Code pro Zeile zu speichern.
Eine sinnvolle Reihenfolge festlegen
Die alphabetische Reihenfolge der Größen setzt L vor M und M vor S. Lege die tatsächliche Größenreihenfolge ausdrücklich fest:
size_type = pd.CategoricalDtype(["S", "M", "L"], ordered=True)
sizes = s.astype(size_type)
Nun folgt die Sortierung S, M, L, Vergleiche wie sizes > "S" sind sinnvoll und sizes.max() ist „L“, wenn L vorkommt. Bei ungeordneten Bezeichnungen wie Ländern funktionieren Gleichheitsprüfungen, aber Größer-als-Vergleiche lösen einen TypeError aus. as_ordered() nutzt die vorhandene Kategorienreihenfolge; prüfe sie, bevor du sie als sinnvoll festlegst.
Die erlaubten Bezeichnungen ändern
Du kannst „XL“ keinen kategorialen Daten zuweisen, die nur S, M und L erlauben. Weise zuerst das erweiterte Ergebnis zu, sizes = sizes.cat.add_categories("XL"), und dann den neuen Wert.
Die Umwandlung von Text in eine feste Kategorienliste kann nicht aufgeführte Werte zu fehlenden Werten machen. pandas 3.1 warnt, dass diese verlustbehaftete Umwandlung künftig einen Fehler auslösen wird. Prüfe die Ausgangswerte vor der Umwandlung mit value_counts(), besonders nachdem du Schreibweisen bereinigt hast.
Die .cat-Methoden erfüllen unterschiedliche Zwecke:
rename_categories({"S": "small"})ändert eine Bezeichnung und behält ihre zugeordneten Werte.remove_categories("L")entfernt eine erlaubte Bezeichnung und macht vorhandene L-Werte zu fehlenden Werten.set_categories([...])ersetzt die ganze Kategorienliste.reorder_categories([...], ordered=True)ändert die Reihenfolge, ohne die erlaubten Bezeichnungen zu ändern.remove_unused_categories()entfernt Bezeichnungen, denen aktuell keine Werte zugeordnet sind.
value_counts() zeigt jede erlaubte Kategorie an, auch solche mit null Beobachtungen. Bei einem S/M/L-Typ, der nur S und M enthält, erscheint L dennoch mit der Anzahl 0. So wird eine leere Gruppe sichtbar, für die gewöhnliche Textdaten keine Bezeichnung gespeichert haben.
Kategorien für die weitere Verarbeitung nutzbar halten
cut erzeugt kategoriale Intervalle und get_dummies wandelt die Zugehörigkeit zu Kategorien in Indikatorspalten um. Würdest du ungeordnete Ländercodes als Zahlen an ein Modell übergeben, würde dies eine künstliche Reihenfolge und künstliche Abstände unterstellen. Indikatoren vermeiden diese Interpretation.
Das Aneinanderfügen kategorialer Spalten mit unterschiedlichen Kategorienlisten führt normalerweise zum Verlust des kategorialen Datentyps. Stimme zuerst ihre Kategorienlisten aufeinander ab oder nutze pd.concat(..., union_categories=True) in pandas 3.1, wenn die Listen zusammengeführt werden sollen. Prüfe sowohl den Datentyp des Ergebnisses als auch die Kategorienreihenfolge.
Wichtige Erkenntnisse
- Kategoriale Daten speichern eine Liste von Bezeichnungen und ganzzahlige Kennungen.
- Lege die Kategorienreihenfolge ausdrücklich fest, wenn eine Rangfolge sinnvoll ist.
- Füge eine Kategorie hinzu, bevor du eine neue Bezeichnung zuweist.
- Das Entfernen einer verwendeten Kategorie macht ihre Werte zu fehlenden Werten.
- Nutze Indikatoren für ungeordnete Kategorien in numerischen Modellen.
- Stimme Kategorienlisten vor dem Aneinanderfügen aufeinander ab oder vereinige sie gezielt.
4DataFrames kombinieren
Durch das Kombinieren von Tabellen kannst du Informationen oder Beobachtungen hinzufügen oder Lücken aus einer Ersatzquelle füllen. Das sind unterschiedliche Aufgaben. Ordne mit merge ausdrückliche Schlüssel zu, arbeite mit join und combine_first anhand von Indexbezeichnungen und füge passende Teile mit concat aneinander. Bevor du einem Ergebnis vertraust, überlege, welche Zeilen erhalten bleiben und wie viele Übereinstimmungen jeder Schlüssel erzeugen sollte; die Beispiele zeigen, warum unerwartetes Wachstum oft mit einem wiederholten Zuordnungsschlüssel beginnt.
4.1 Vorhersagen, was bei einem Verbund erhalten bleibt
Ein Verbund ordnet Zeilen anhand von Schlüsselwerten einander zu und stellt ihre Informationen nebeneinander. Der Schlüssel muss in beiden Tabellen dasselbe bezeichnen, etwa die Kunden-ID einer Bestellung und die Kunden-ID in einer Zuordnungstabelle.
Den Schlüssel angeben und den Verbundtyp wählen
Nutze orders.merge(customers, on="customer_id"). Ohne on verwendet pandas alle Spaltennamen, die in beiden Tabellen vorkommen. Eine andere gemeinsame Spalte wie date könnte dann gültige Kundenzuordnungen verhindern.
Angenommen, Bestellungen haben die Kunden-IDs 10, 20, 20, 30, 50. Die Kundentabelle hat jeweils eine Zeile für 10, 20, 30, 40.
how | Was erhalten bleibt | Ergebniszeilen |
|---|---|---|
"inner" | Übereinstimmende Schlüssel auf beiden Seiten | 4 |
"left" | Jede linke Zeile und ihre Übereinstimmungen | 5 |
"right" | Jede rechte Zeile und ihre Übereinstimmungen | 5 |
"outer" | Schlüssel von beiden Seiten | 6 |
"cross" | Jedes Paar aus linker und rechter Zeile | 20 |
Der innere Verbund ist die Standardeinstellung. Bei einem linken äußeren Verbund fehlen für Kunde 50 die Kundendaten. Ein rechter äußerer Verbund enthält Kunde 40 ohne Bestellung sowie beide Bestellungen für 20. Ein vollständiger äußerer Verbund enthält beide nicht zugeordneten Schlüssel. Ein Kreuzverbund braucht keinen Schlüssel, weil er gezielt jede Zeile mit jeder anderen kombiniert. pandas 3 bietet außerdem left_anti und right_anti für Zeilen ohne passenden Schlüssel auf der anderen Seite.
Prüfen, wie viele Übereinstimmungen eine Zeile haben kann
Zwei linke Zeilen für Schlüssel 20 und drei rechte Zeilen für Schlüssel 20 erzeugen sechs Paare. Der Verbund wählt nicht nur eine rechte Zeile aus. Wenn du im Beispiel eine zweite Kundenzuordnungszeile für 20 hinzufügst, wächst das Ergebnis des inneren Verbunds von vier auf sechs Zeilen.
Gib die beabsichtigte Beziehung mit validate an:
merged = orders.merge(
customers, on="customer_id", how="left",
validate="many_to_one"
)
Dies erlaubt viele Bestellungen pro Kunde, verlangt aber eindeutige Kunden-IDs auf der rechten Seite. Ein wiederholter rechter Schlüssel löst einen MergeError aus. one_to_one verlangt Eindeutigkeit auf beiden Seiten; one_to_many verlangt sie auf der linken Seite. many_to_many erlaubt Wiederholungen auf beiden Seiten und prüft die Eindeutigkeit nicht.
Nicht zugeordnete Zeilen untersuchen
Ein vollständiger äußerer Verbund mit indicator=True fügt _merge hinzu. Hier lauten die Anzahlen vier both, ein left_only und ein right_only. Das sind Zeilen, keine unterschiedlichen Schlüssel: Wiederholte Bestellungen können mehrere both-Zeilen für einen Kunden erzeugen.
Um unterschiedliche nicht zugeordnete Schlüssel auf der Bestellseite zu zählen, nutze m.loc[m["_merge"] == "left_only", "customer_id"].nunique(). Das Untersuchen der Zeilen kann fehlende Zuordnungseinträge oder uneinheitlichen Text aufdecken.
Namen und Schlüsselformate steuern
Haben Schlüssel unterschiedliche Namen, nutze left_on="customer_id", right_on="id". Beide Schlüsselspalten bleiben verfügbar. Mehrere Schlüssel lassen sich gemeinsam mit on=["city", "year"] abgleichen; beide müssen übereinstimmen.
Gleichnamige Spalten außerhalb der Schlüsselspalten erhalten _x und _y. Wähle aussagekräftige Suffixe wie suffixes=("_order", "_ship"), damit die Herkunft klar bleibt.
Schlüssel brauchen kompatible Datentypen und gleiche Werte. Die Zahl 1 kann zur Zahl 1,0 passen, aber ganzzahlige und textbasierte Schlüsselspalten können einen Fehler beim Verbinden auslösen. Wandle ihre Formate gezielt um. „ana“ und „Ana “ sind unterschiedliche Texte; vereinheitliche Groß- und Kleinschreibung sowie äußere Leerzeichen vor dem Verbinden, wenn sie dieselbe Person bezeichnen.
Auch fehlende Schlüssel müssen untersucht werden: pandas ordnet fehlende Schlüssel auf einer Seite fehlenden Schlüsseln auf der anderen Seite zu. Enthalten beide Seiten mehrere solche Zeilen, können sich auch diese Übereinstimmungen vervielfachen.
Wichtige Erkenntnisse
- Gib Verbundschlüssel ausdrücklich an.
- Wähle den Verbundtyp danach, welche Quellzeilen erhalten bleiben müssen.
- Wiederholte Schlüssel erzeugen jedes passende Paar.
- Nutze
validate, um die beabsichtigte Schlüsselbeziehung zu prüfen. - Nutze einen vollständigen äußeren Verbund mit einem Indikator, um nicht zugeordnete Zeilen zu untersuchen.
- Prüfe Schlüsselwerte, Formate und Suffixe, bevor du das Ergebnis verwendest.
4.2 Werte bei übereinstimmenden Indexbezeichnungen kombinieren
Ein Index kann den Schlüssel enthalten, den du abgleichen möchtest. pandas nutzt diese Bezeichnungen beim Verknüpfen von Tabellen, beim Ergänzen fehlender Werte oder beim Addieren zweier Series. Die Zeilenposition allein entscheidet nicht über die Zuordnung.
Anhand von Indexbezeichnungen verknüpfen
left.join(right) gleicht die beiden Indizes ab und erstellt standardmäßig einen linken äußeren Verbund. Dagegen erstellt merge standardmäßig einen inneren Verbund. Du kannst auch left.merge(right, left_index=True, right_index=True) schreiben, wenn beide Schlüssel im Index liegen.
Angenommen, stations hat die Indexbezeichnungen A, B, C und die Höhen 120, 850, 15 m. Eine Messwerttabelle hat die Stationsindexbezeichnungen A, B, B, D. readings.join(stations) behält vier Zeilen und ergänzt die Höhen 120, 850, 850 und NaN. Beide B-Messwerte erhalten die Höhe von B. Mit how="inner" bleiben nur die drei Messwerte für A und B erhalten.
Wenn die Messwerttabelle Stations-IDs in einer gewöhnlichen Spalte enthält, nutze readings.join(stations, on="station"). Die linke Spalte wird mit dem rechten Index abgeglichen. Die entsprechende Form mit merge lautet readings.merge(stations, left_on="station", right_index=True, how="left").
Die Position des Schlüssels deutlich machen
set_index("station") verschiebt die Stationsspalte in den Index. reset_index() stellt sie als gewöhnliche Spalte wieder her. So kannst du eine Anordnung wählen, bei der sich die Zuordnung leicht prüfen lässt. left.join([t1, t2]) kann mehrere Tabellen mit gemeinsamen Indexbezeichnungen gleichzeitig verknüpfen.
Enthalten beide verknüpften Tabellen eine Spalte außerhalb der Schlüsselspalten wie source, löst join einen ValueError aus, sofern du die Namen nicht unterscheidbar machst. Schreibe in pandas 3.1 suffixes=("_left", "_right"); dies ersetzt die älteren Argumente lsuffix und rsuffix. Die Suffixe erhalten beide Versionen, ohne zu entscheiden, welcher Wert maßgeblich ist.
Lücken aus einer Ersatzquelle ergänzen
a.combine_first(b) behält bekannte Werte in a, füllt dessen Lücken aus b bei übereinstimmenden Bezeichnungen und nimmt Bezeichnungen auf, die nur in b vorkommen.
| Bezeichnung | a | b | a.combine_first(b) |
|---|---|---|---|
| a | 1 | 10 | 1 |
| b | NaN | 20 | 20 |
| c | 3 | 30 | 3 |
| d | nicht vorhanden | 40 | 40 |
Das Ergebnis behält 1 und 3, weil die erste Quelle diese Werte bereits kennt. Es nutzt 20, um die Lücke zu füllen, und ergänzt die Bezeichnung d mit 40. Drehst du den Aufruf um, ändert sich, welche Quelle Vorrang hat. Das ist nützlich, wenn eine Hauptdatenquelle Vorrang vor einer Ersatzquelle haben soll, selbst wenn ihre Zeilenreihenfolgen unterschiedlich sind.
Ausrichtung bei Rechenoperationen erkennen
x enthalte a = 5 und b = 7; y enthalte b = 1 und c = 2. x + y ergibt b = 8 und fehlende Ergebnisse bei a und c, weil jeweils ein Operand fehlt. Der Aufruf addiert nicht den ersten Wert von x zum ersten Wert von y.
x.add(y, fill_value=0) setzt für die fehlende Seite null ein und ergibt a = 5, b = 8, c = 2. Nutze diese Regel, wenn ein fehlender Beitrag als null zählen soll. Die Ausrichtung anhand von Indexbezeichnungen ist das gemeinsame Prinzip hinter diesen Operationen, aber ihre Regeln für Werte unterscheiden sich: join fügt Spalten hinzu, combine_first füllt Lücken und Rechenoperationen rechnen mit zugeordneten Werten.
Wichtige Erkenntnisse
joingleicht standardmäßig Indizes mit einem linken äußeren Verbund ab;mergenutzt standardmäßig einen inneren Verbund.- Bei
join(on="station")wird die linke Spalte mit dem rechten Index abgeglichen. - Nutze Suffixe, um gleichnamige Spalten außerhalb der Schlüsselspalten zu unterscheiden.
combine_firstgibt bekannten Werten des aufrufenden Objekts Vorrang.- Rechenoperationen richten Werte anhand von Bezeichnungen aus;
fill_valuesteuert fehlende Beiträge.
4.3 Passende Tabellen mit concat aneinanderfügen
Monatsdateien enthalten meist weitere Zeilen derselben Art von Beobachtung. Die Verkettung fügt diese Teile zu einer Tabelle zusammen. Sie richtet die Bezeichnungen auf der anderen Achse aus; sie sucht nicht nach übereinstimmenden Kunden- oder Bestellschlüsseln.
Zeilen untereinanderfügen und Spalten ausrichten
pd.concat([jan, feb]) fügt Zeilen untereinander, weil axis=0 die Standardeinstellung ist. Angenommen, Januar enthält drei Fahrten mit den Spalten trip und km, während Februar zwei Fahrten mit trip, km und note enthält. Das Ergebnis hat fünf Zeilen und drei Spalten. Die fehlenden note-Zellen für Januar werden zu NaN.
join="outer" ist die Standardeinstellung: Sie behält die Vereinigung der Spaltennamen. join="inner" behält nur gemeinsame Namen, sodass das Ergebnis fünf Zeilen und die zwei Spalten trip und km hat. Es enthält weiterhin alle fünf Beobachtungen; die Einstellung für join steuert die andere Achse.
Die Spaltenreihenfolge in den Teilen bestimmt die Zuordnung nicht. Entscheidend sind die exakten Namen. Verwendet ein Teil km und der andere Km, enthält das Ergebnis zwei teilweise leere Spalten. Benenne die Überschriften vor dem Aneinanderfügen um.
Entscheiden, was die Zeilenbezeichnungen bedeuten sollen
Die ursprünglichen Indizes bleiben standardmäßig erhalten. Bei den Ausgangsindizes 0, 1, 2 und 0, 1 wiederholt das Ergebnis die Bezeichnungen 0 und 1. result.loc[0] wählt zwei Zeilen aus. Nutze ignore_index=True, wenn diese Zahlen keine Bedeutung haben und du neue Bezeichnungen von 0 bis 4 möchtest.
Wenn die Herkunft wichtig ist, nutze eine äußere Indexebene:
result = pd.concat(
[jan, feb], keys=["jan", "feb"], names=["month", "row"]
)
Nun wählt result.loc["feb"] die zwei Februarzeilen aus. keys hält die Herkunft innerhalb eines MultiIndex fest. In pandas 3 löst die Kombination von keys mit ignore_index=True einen ValueError aus; wähle für diese Operation Herkunftsbezeichnungen oder einen neuen einfachen Index.
Spalten nebeneinanderstellen
pd.concat([x, y], axis=1) richtet Zeilen anhand ihrer Indexbezeichnung aus. Für x mit a = 1, b = 2 und y mit b = 3, c = 4 hat das Ergebnis die Zeilen a, b, c. Die Spalte x fehlt bei c und y fehlt bei a. Mit join="inner" bleibt nur b erhalten.
| Operation | Hinzugefügt entlang der | Bezeichnungen ausgerichtet anhand der |
|---|---|---|
concat(..., axis=0) | Zeilen | Spaltennamen |
concat(..., axis=1) | Spalten | Zeilenindizes |
merge(..., on="id") | passenden Zeilenpaare | Werte der Schlüsselspalten |
Speicherung prüfen und Teile effizient sammeln
Eine Spalte, die numerische Werte und Text mischt, kann den Datentyp object erhalten. Entsteht bei gewöhnlichen NumPy-Daten vom Typ int64 eine Lücke, werden sie zu float64; der pandas-Datentyp "Int64" mit Fehlwertunterstützung kann ganze Zahlen mit <NA> behalten. Stimme die Datentypen vor dem Kombinieren aufeinander ab, wenn die Spalte einen festgelegten Typ hat.
DataFrame.append wurde in pandas 2.0 entfernt. Sammle bei vielen Dateien DataFrames in einer Liste und rufe pd.concat nach der Schleife einmal auf. Wird in jedem Durchlauf ein wachsendes Ergebnis neu erstellt, werden die angesammelten Daten wiederholt kopiert und der Vorgang wird langsam.
Prüfe, ob die Länge des Ergebnisses beim Aneinanderfügen von Zeilen der Summe der Eingabelängen entspricht. Untersuche danach Spaltennamen, Anzahl fehlender Werte und Datentypen.
Wichtige Erkenntnisse
- Das Aneinanderfügen von Zeilen richtet Spaltennamen aus und addiert die Zeilenanzahlen der Eingaben.
joinwählt gemeinsame oder alle Bezeichnungen auf der anderen Achse.- Nutze
ignore_indexfür entbehrliche Bezeichnungen oderkeys, um die Herkunft festzuhalten. - Das Aneinanderfügen von Spalten richtet die Zeilenindizes aus.
- Sammle viele Teile zuerst und füge sie einmal zusammen.
5Daten mit hierarchischen Indizes, pivot und melt umformen
Dieselben Messwerte lassen sich als Zeilen, Spalten oder Ebenen eines Index anordnen. Nutze einen MultiIndex, um Beobachtungen mit mehreren Schlüsseln zu bezeichnen, und verschiebe diese Schlüssel dann mit stack und unstack oder mit pivot und melt. Achte darauf, welche Bezeichnungen eine Zelle identifizieren und ob sie eindeutig sind. Das macht das Umformen vorhersehbar und hilft dir, eine fehlende Kombination von einer gemessenen Null oder einem Paar von Datensätzen zu unterscheiden, das eine ausdrückliche Aggregation benötigt.
5.1 Zeilen mit mehr als einer Indexebene auswählen
Ein MultiIndex gibt jeder Zeile mehrere Bezeichnungen. Eine Umsatzzeile kann sowohl durch Stadt als auch durch Jahr identifiziert werden, geschrieben als Tupel wie ("Osaka", 2024). Jede Bezeichnung gehört zu einer Ebene und die Reihenfolge dieser Ebenen ist für die Auswahl wichtig.
Den Index erstellen und benennen
df.set_index(["city", "year"]) verschiebt diese Spalten in den Index. pd.MultiIndex.from_product([["Lima", "Osaka"], [2024, 2025]], names=["city", "year"]) bildet jede Kombination der angegebenen Bezeichnungen. Auch das Aneinanderfügen mit keys fügt eine Ebene hinzu.
Für die Beispiele hat sales diese Indexpaarungen und Werte:
| city | year | sales |
|---|---|---|
| Osaka | 2024 | 120 |
| Osaka | 2025 | 135 |
| Lima | 2024 | 80 |
| Lima | 2025 | 95 |
Nach dem Festlegen der beiden Indexebenen ist df.index.names gleich ["city", "year"]. rename_axis(["town", "yr"]) ändert die Ebenennamen, ohne ihre Werte zu ändern.
Eine äußere Bezeichnung oder ein vollständiges Tupel auswählen
df.loc["Osaka"] wählt beide Zeilen für Osaka aus. Die ausgewählte Stadtebene fällt weg, sodass 2024 und 2025 als Index bleiben. df.loc[("Lima", 2025), "sales"] wählt eine Zelle aus und gibt 95 zurück.
Eine einzelne an loc übergebene Bezeichnung sucht in der äußersten Ebene. df.loc[2024] sucht daher nach einer Stadt namens 2024 und löst in dieser Tabelle einen KeyError aus. Um ein Jahr über alle Städte hinweg auszuwählen, nutze df.xs(2024, level="year"). Der Aufruf gibt für Osaka 120 und für Lima 80 zurück, wobei die Stadt als verbleibender Index dient.
Für eine allgemeinere Auswahl behält df.loc[pd.IndexSlice[:, 2025], :] alle Städte im Jahr 2025. Der Doppelpunkt an der ersten Position bedeutet alle Bezeichnungen auf dieser Ebene; der letzte Doppelpunkt wählt alle Spalten aus.
Vor Slices über Bereiche sortieren
Die Auswahl anhand exakter Bezeichnungen benötigt keinen insgesamt sortierten Index, aber für einen Slice über einen Bezeichnungsbereich muss passend sortiert sein. Nutze df.sort_index() vor df.loc["Lima":"Osaka"]. Ein unsortierter MultiIndex kann für einen solchen Slice einen UnsortedIndexError auslösen.
sort_index() sortiert alle Ebenen in ihrer aktuellen Reihenfolge, also zuerst Städte und innerhalb jeder Stadt die Jahre. sort_index(level="year") sortiert nach der benannten Ebene. swaplevel("city", "year") setzt das Jahr an die äußere Position; rufe danach sort_index() auf, um die neue Anordnung zu gruppieren und zu sortieren. Das bloße Vertauschen der Ebenenpositionen sortiert die Zeilen nicht.
Bezeichnungen zurück in Spalten verschieben
reset_index() stellt beide Ebenen als Spalten wieder her. reset_index(level="year") stellt nur das Jahr wieder her und belässt die Stadt als Index. Mit diesen Operationen kannst du eine Tabelle für einen Verbund oder zum Speichern vorbereiten, ohne ihre identifizierenden Werte zu verlieren.
Auch Spalten können mehrere Ebenen haben. Eine Umformung mit Umsatz- und Personalwerten kann Spaltenbezeichnungen wie ("sales", 2024) und ("staff", 2025) erzeugen. df["sales"] wählt alle Spalten unter der Umsatzbezeichnung auf der obersten Ebene aus.
Für eine Summe nach Stadt ergibt df.groupby(level="city")["sales"].sum() Lima 175 und Osaka 255. Nutze für diese Zusammenfassung die Gruppierung; das alte Argument sum(level="city") wurde in pandas 2.0 entfernt.
Wichtige Erkenntnisse
- Ein Tupel identifiziert eine vollständige MultiIndex-Bezeichnung über alle Ebenen hinweg.
- Die Auswahl mit einer einzelnen Bezeichnung in
locbeginnt auf der äußersten Ebene. - Nutze
xsoderIndexSlice, um eine innere Ebene auszuwählen. - Sortiere den Index vor einem Slice über einen Bezeichnungsbereich.
- Vertausche Ebenen, um ihre Rollen zu ändern, und setze sie zurück, um Spalten wiederherzustellen.
- Nutze
groupby(level=...)für Zusammenfassungen nach einer Indexebene.
5.2 Bezeichnungen zwischen Index und Spalten verschieben
stack und unstack ändern, wo Bezeichnungen stehen. Werte behalten ihre identifizierende Kombination, aber die Tabelle kann Kombinationen sichtbar machen, für die es keine Beobachtung gab.
Spaltenbezeichnungen in den Index stapeln
Angenommen, ein breiter DataFrame hat die Städte Osaka und Lima als Index und die Jahre 2024 und 2025 als Spalten. Osaka hat die Werte 120 und 135; Lima hat 80 und 95. Benenne die Achsen city und year, damit ihre Bedeutung sichtbar bleibt.
long = wide.stack() verschiebt die Jahresbezeichnungen in eine neue innerste Indexebene. Bei diesen einstufigen Spalten ist das Ergebnis eine Series mit vier Werten:
("Osaka", 2024)ergibt 120.("Osaka", 2025)ergibt 135.("Lima", 2024)ergibt 80.("Lima", 2025)ergibt 95.
Die Stadtbezeichnungen wiederholen sich, weil jede Stadt nun eine Zeile pro Jahr hat. Beim Stapeln wurden die Werte weder summiert noch zusätzliche Messwerte erzeugt.
Eine Indexebene mit unstack in Spalten verschieben
long.unstack() verschiebt die innerste Indexebene, das Jahr, in Spalten und stellt die breite Anordnung wieder her. long.unstack("city") verschiebt stattdessen die Stadt und erzeugt Jahre als Zeilen und Städte als Spalten. Eine numerische Ebenenposition wie unstack(0) kann dieselbe Ebene auswählen, aber ein Name macht die Absicht leichter lesbar.
| Operation | Verschiebung der Bezeichnungen |
|---|---|
stack() | Eine Spaltenebene wird zu einer inneren Indexebene |
unstack() | Eine Indexebene wird zu einer Spaltenebene |
Hat die Eingabe hierarchische Spalten, kann beim Stapeln einer Ebene eine andere Ebene als Spalten erhalten bleiben. Für Spalten wie ("sales", 2024) und ("staff", 2024) gibt stack("year") einen DataFrame mit Umsatz- und Personalspalten zurück. Das Stapeln aller Spaltenebenen ergibt eine Series.
Fehlende Kombinationen sichtbar halten
Angenommen, die lange Series enthält nun keinen Eintrag für Lima 2025. Das Umformen mit unstack erzeugt eine rechteckige Tabelle mit Städten und Jahren und führt daher an dieser Stelle NaN ein. Gewöhnliche ganzzahlige Werte werden zu Gleitkommazahlen, wenn diese fehlende Zelle ein Fehlwertkennzeichen für Gleitkommazahlen erfordert.
unstack(fill_value=0) kann eine neu fehlende Kombination mit null füllen. Nutze dies nur, wenn das Fehlen null bedeutet, etwa keine erfassten Verkäufe in einem vollständigen Datensatz von Verkaufsereignissen. Eine fehlende Sensorbeobachtung ist unbekannt und sollte fehlend bleiben.
stack() in pandas 3 behält fehlende Zellen. Das Stapeln der unvollständigen 2 × 2-Tabelle ergibt daher vier Einträge, darunter NaN. Füge .dropna() hinzu, wenn du nur die drei bekannten Werte möchtest. Das Entfernen von Lücken ändert, welche Kombinationen noch dargestellt werden. Prüfe daher die Länge des Ergebnisses.
Doppelte Kombinationen zuerst behandeln
Für unstack wird ein einzelner Wert pro vollständiger Indexkombination benötigt. Zwei Einträge mit der Bezeichnung ("Lima", 2025) beanspruchen dieselbe Ausgabezelle und lösen ValueError: Index contains duplicate entries, cannot reshape aus.
Nutze long.index.duplicated(), um wiederholte vollständige Bezeichnungen zu untersuchen, oder prüfe die entsprechenden Schlüsselspalten vor dem Festlegen des Index. Entscheide, ob die Zeilen versehentliche Kopien oder getrennte Beobachtungen sind, die zusammengefasst werden sollten. Sie zu entfernen oder zu aggregieren ist eine Entscheidung über die Daten; unstack wählt keine Regel für dich.
Wichtige Erkenntnisse
stackverschiebt Spaltenbezeichnungen nach innen;unstackverschiebt Indexbezeichnungen nach außen.- Wähle die Ebene ausdrücklich, wenn die Standardeinstellung nicht die benötigte Ebene ist.
- Fehlende Kombinationen erscheinen beim Umformen ins Breitformat als fehlende Zellen.
- Das Stapeln in pandas 3 behält fehlende Werte, sofern du sie nicht anschließend entfernst.
- Für unstack muss jede vollständige Indexkombination eindeutig sein.
5.3 Zwischen langen und breiten Tabellen wechseln
Im Langformat stehen identifizierende Spalten neben einer Wertespalte. Im Breitformat sind Messwerte auf mehrere Spalten verteilt, etwa eine Spalte pro Jahr. Wähle die Anordnung, die den nächsten Schritt erleichtert: Lange Tabellen eignen sich zum Filtern und Gruppieren, während breite Tabellen direkte Vergleiche nebeneinander ermöglichen.
Eindeutige Paare in Zellen pivotieren
Eine lange Tabelle mit den Spalten city, year und sales wird mit df.pivot(index="city", columns="year", values="sales") breit. Stadtbezeichnungen bilden Zeilen, Jahre bilden Spalten und Umsätze füllen die Zellen. Dies entspricht df.set_index(["city", "year"])["sales"].unstack().
Die Umsätze von Osaka für 2024 und 2025 von 120 und 135 werden zu zwei Zellen in einer Zeile. Die Werte 80 und 95 von Lima bilden die zweite Zeile. Das Vertauschen der Argumente index und columns transponiert diese Anordnung. Lässt du values weg, werden alle verbleibenden Datenspalten pivotiert und es können hierarchische Spalten entstehen, etwa eine Umsatzebene und eine Personalebene über den Jahren.
Entscheiden, ob Wiederholungen Fehler oder Beobachtungen sind
pivot ordnet Werte um und kann sie nicht zusammenfassen. Zwei Zeilen für Lima 2025 würden zwei Werte in einer Ausgabezelle erfordern und lösen daher einen ValueError aus. Zähle wiederholte Paare mit df.duplicated(subset=["city", "year"]).sum().
Sollen getrennte Beobachtungen zusammengefasst werden, nutze pivot_table mit einer gewählten Aggregation. Für die Werte 95 und 105 bei Lima 2025 ergibt der standardmäßige Mittelwert 100,0. Mit aggfunc="sum" ist der Zellwert 200. Sollte jedes Paar einmal vorkommen, behalte pivot bei, damit ein Datenfehler sichtbar wird, statt ihn unbemerkt zusammenzufassen.
Messwertspalten mit melt in Zeilen umformen
Angenommen, eine CSV-Datei liefert die Spalten city, 2023, 2024 und 2025. Die Werte für Osaka sind 110, 120, 135; die für Lima sind 70, 80, 95. Forme die Jahresspalten um:
long = wide.melt(
id_vars="city", var_name="year", value_name="sales"
)
id_vars bleibt erhalten und wird wiederholt. Jede Messwertspaltenbezeichnung wird zu einem Jahreswert; jede Zelle wird zu einem Umsatzwert. Zwei Zeilen und drei Messwertspalten erzeugen sechs lange Zeilen, darunter eine wie Osaka, „2023“, 110. Auch fehlende Messwertzellen werden zu Zeilen, sofern du sie nicht anschließend entfernst.
Da diese Spaltenbezeichnungen aus CSV-Text stammen, sind die entstehenden Jahreswerte Text. Nutze long["year"] = long["year"].astype(int), bevor du mit ihnen rechnest. Ganzzahlige Eingabespaltenbezeichnungen würden bereits ganzzahlige Jahreswerte ergeben.
Steuern, was umgeformt wird, und die Form wiederherstellen
value_vars=["2024", "2025"] beschränkt das Umformen auf diese Spalten. Wenn du id_vars vergisst, können Städtenamen zusammen mit Messwerten in dieselbe Wertespalte gelangen. Unterscheide Kennungen immer von den Spalten, die Werte enthalten.
Ohne ausdrückliche Namen heißt die Wertespalte value. Die Variablenspalte übernimmt wide.columns.name oder heißt variable, wenn dieser Name leer ist. Ausdrückliche Angaben für var_name und value_name erleichtern die Verwendung des Ergebnisses.
Pivotiere die sechs Zeilen mit index="city", columns="year", values="sales" zurück, um die drei Jahresspalten wiederherzustellen. Nach dem Pivotieren ist die Stadt der Index und die Spaltenachse heißt year. reset_index() stellt die Stadt als Spalte wieder her und rename_axis(columns=None) entfernt den Namen der Spaltenachse. Prüfe sowohl die Form als auch die Bezeichnungen, bevor du die Tabelle verknüpfst oder speicherst.
Wichtige Erkenntnisse
- Im Langformat stehen Messwertbezeichnungen in Zeilen, im Breitformat in Spalten.
pivotbenötigt eindeutige Zeilen-Spalten-Paare und führt keine Aggregation durch.pivot_tablefasst wiederholte Paare mit der gewählten Aggregation zusammen.meltwiederholt Kennungen und erstellt eine Zeile pro Messwertzelle.- Prüfe die Typen von Spaltenbezeichnungen, wenn sie zu Werten werden.
- Setze Indizes und Achsennamen zurück, wenn eine flache Ausgabetabelle benötigt wird.
Datenaufbereitung mit pandas: Beispiele
1Messwerte bereinigen, ohne ihre Bedeutung zu verlieren
16 Schritte
- 1EinführungEntscheiden, was jede Lücke bedeutet
Eine Wettertabelle enthält vier Städte und zwei Messwertspalten: Temperatur in °C und Niederschlag in mm. Einige Messwerte fehlen. Du wirst diese Lücken finden, entscheiden, welche Zeilen nutzbar sind, und einen wiederholten Datensatz von einer tatsächlich anderen Beobachtung unterscheiden. Das gewünschte Ergebnis ist eine Tabelle, deren verbleibende Werte weiterhin das bedeuten, was du annimmst. Nutze für den Code
import pandas as pdundimport numpy as np. - 2ErklärungDas Fehlwertkennzeichen erkennen
Eine Lücke kann je nach Datentyp als
NaN,NaToderpd.NAerscheinen. AuchNonewird als fehlend erkannt.Nutze
df.isna(), um eine boolesche Tabelle mitTruean jeder Lücke zu erstellen. Ein Vergleich mitnp.nanübersieht diese Werte, weil NaN selbst sich selbst nicht gleich ist. Mit der Erkennungsmethode funktioniert dieselbe Prüfung für numerische Spalten, Textspalten und Datum-Zeit-Spalten. - 3BeispielDie Lücken in den Wetterdaten zählen
Lima hat die Temperatur 18 und den Niederschlag 0. Bei Oslo fehlt die Temperatur, aber der Niederschlag beträgt 4. Pune hat die Temperatur 31 und der Niederschlag fehlt. Bei Kyiv fehlen beide Messwerte. Jeder Stadtname ist bekannt.
df.isna().sum()ergibt Stadt 0, Temperatur 2 und Niederschlag 2.df.isna().mean()ergibt Fehlwertanteile von 0, 0,5 und 0,5, weil jede Spalte vier Einträge hat. - 4KernaussageZellen von Zeilen unterscheiden
Bei Kyiv fehlen zwei Zellen, bei Oslo und Pune jeweils eine. Es gibt vier fehlende Zellen, aber nur drei betroffene Zeilen.
df.isna().sum().sum()zählt die Zellen.df.isna().any(axis=1).sum()markiert zuerst, ob jede Zeile eine Lücke hat, und zählt dann diese Zeilen. Das zeilenweiseanyverhindert, dass Kyiv zweimal gezählt wird. - 5HerausforderungEinen versteckten Fehlwertcode finden
Eine Sensorspalte enthält 0, 7, -999 und
NaN. Laut Dokumentation bedeutet -999, dass der Sensor ausgeschaltet war. Wie viele Werte sollten nach der Bereinigung bekannt bleiben?---reveal---
Zwei: 0 und 7. Ersetze den dokumentierten Code -999 durch ein Fehlwertkennzeichen und nutze dann erneut
isna(). Null ist hier ein echter Messwert. Würdest du jede Null als fehlend behandeln, würdest du zusammen mit den nicht verfügbaren Messwerten einen bekannten Wert entfernen. - 6BeispielZeilen mit einer Temperatur behalten
Angenommen, die Analyse benötigt die Temperatur, kann aber unbekannten Niederschlag tolerieren. Nutze
clean = df.dropna(subset=["temp_c"]). Dies behält Lima und Pune.Das standardmäßige
dropna()würde nur Lima behalten, weil es jede Spalte prüft.thresh=2würde auch Oslo behalten, wo Stadt und Niederschlag bekannt sind. Wähle die Regel, die ausdrückt, welche Spalten die Analyse tatsächlich benötigt. - 7BeispielSchätzwerte vor dem Auffüllen markieren
Beginne für eine Niederschlagsanalyse, die alle Städte behält, mit den ursprünglichen vier Zeilen. Speichere vor dem Auffüllen der Temperaturen
df["temp_missing"] = df["temp_c"].isna().Die bekannten Temperaturen 18 und 31 ergeben im Mittel 24,5. Weise
df["temp_c"] = df["temp_c"].fillna(df["temp_c"].mean())zu, um die zwei Lücken zu füllen. Der gespeicherte Indikator kennzeichnet die Werte für Oslo und Kyiv weiterhin als geschätzte Messwerte. - 8TippDie Schätzung nach ihrer Bedeutung wählen
Das Auffüllen mit dem Mittelwert nutzt die bekannten Messwerte als einfache Schätzung, verringert aber die scheinbare Streuung. Der Median reagiert weniger empfindlich auf extreme Messwerte. Das Auffüllen mit null besagt etwas anderes: Die fehlende Größe war null.
Ein ausgeschalteter Regensensor belegt keinen Niederschlag von null. Nutze pro Spalte Füllwerte, die zu deren Datentyp passen, etwa ein Dictionary mit numerischen Werten für numerische Felder und Text für Textfelder.
- 9VerbindungDie Reihenfolge nur nutzen, wenn sie Informationen trägt
Das Vorwärtsauffüllen übernimmt den vorherigen bekannten Wert in eine Lücke; das Rückwärtsauffüllen nutzt den nächsten. Bei 12,
NaN,NaN, 15 ergibtffill(limit=1)die Werte 12, 12,NaN, 15.Interpolation schätzt dagegen zwischen bekannten Positionen: Aus 10,
NaN,NaN, 16 wird 10, 12, 14, 16. Diese Methoden eignen sich für sinnvoll geordnete Messwerte, nicht für eine Liste von Städten ohne Bezug zueinander. - 10HerausforderungNutzbare Zeilen behalten, ohne null Niederschlag zu unterstellen
Drei Datensätze enthalten A/19/2, B/21/
NaNund C/NaN/5 für Stadt/Temperatur/Niederschlag. Du benötigst Temperaturvergleiche und kannst fehlenden Niederschlag nicht schätzen. Welche Zeilen und Werte solltest du behalten?---reveal---
Behalte A und B, indem du die Temperaturspalte mit
dropna(subset=["temp_c"])prüfst. Lass den Niederschlag für B fehlend. Würdest du alle Spalten beim Entfernen berücksichtigen, ginge die nutzbare Temperatur von B verloren; würdest du den Niederschlag für B mit null auffüllen, fügtest du einen unbelegten Messwert hinzu. - 11BeispielVollständige Datensätze vergleichen
Eine Bestelltabelle hat die IDs 101, 102, 102, 103, 104, 104. Die beiden Zeilen mit 102 sind identisch. Die beiden Zeilen mit 104 unterscheiden sich im erfassten Gewicht: 0,5 kg und 0,8 kg.
df.duplicated().sum()meldet eine zusätzliche Kopie einer vollständigen Zeile.drop_duplicates()lässt fünf Zeilen übrig, weil die unterschiedlichen Datensätze mit 104 keine exakten Kopien sind. Indexbezeichnungen beeinflussen diesen Vergleich nicht. - 12ErklärungEinen Schlüssel und eine zu behaltende Version wählen
Der Vergleich allein anhand von
order_idmarkiert die zweite 102 und die zweite 104 als Wiederholungen und ergibt zwei zusätzliche Schlüsselkopien. Nun stellt sich die Frage, welche Version die jeweilige Bestellung darstellt.keep="last"wählt die letzte in der aktuellen Zeilenreihenfolge. Damit dies die neueste bedeutet, sortiere zuerst nach einem Aktualisierungsfeld.keep=Falseentfernt alle Mitglieder wiederholter Gruppen und würde daher beide Datensätze mit 104 verwerfen. - 13HerausforderungDen neuesten Datensatz behalten
Artikel H hat in dieser Eingabereihenfolge die Aktualisierungen 1, 4, 2 und die Gewichte 3, 6, 5 kg. Wie behältst du seinen neuesten Datensatz und welches Gewicht bleibt erhalten?
---reveal---
Sortiere
updatedaufsteigend und nutze danndrop_duplicates(subset="item", keep="last"). Die letzte Aktualisierung ist 4, daher bleiben 6 kg erhalten. Würdest du ohne Sortierung die letzte Eingabezeile behalten, würdest du Aktualisierung 2 auswählen und fälschlich 5 kg behalten. - 14TippVor der Identitätsprüfung vereinheitlichen
Die Textschlüssel „ Lisbon“, „lisbon“ und „LISBON “ stimmen nicht exakt überein. Entferne äußere Leerzeichen und schreibe sie klein, wenn diese Schreibweisen dieselbe Stadt bezeichnen. Untersuche dann wiederholte Schlüssel.
Der Zweck der Tabelle entscheidet, ob eine Wiederholung zulässig ist: Viele Bestellungen können denselben Kunden haben, aber eine Zuordnungstabelle, die eine Detailzeile pro Kunde liefern soll, benötigt eindeutige Schlüssel. Das Entfernen gültiger Bestellungen kann einen wiederholten Zuordnungsschlüssel nicht korrigieren.
- 15HerausforderungTextbereinigung mit der Auswahl von Datensätzen verbinden
Kundendatensätze haben die Schlüssel „ emi “ und „EMI“, die Aktualisierungen 2 und 5 und die Salden 10 und 14. In einem dritten, nicht zugehörigen Datensatz fehlt der ältere Saldo. Du benötigst den neuesten Datensatz pro Kunde. Was sollte geschehen, bevor Salden aufgefüllt werden?
---reveal---
Vereinheitliche die Schlüssel, sortiere nach Aktualisierung und behalte die letzte Zeile pro bereinigtem Schlüssel. Die beiden Schreibweisen von Emi werden zu einem Kunden mit Saldo 14. Kläre zuerst die Identität der Datensätze, damit veraltete Versionen einen späteren Kennwert zum Auffüllen nicht beeinflussen.
- 16ZusammenfassungDas Ergebnis anhand der Entscheidung prüfen
Vergleiche nach der Bereinigung die Zeilenanzahl, die Anzahl fehlender Werte und die Eindeutigkeit der Schlüssel mit dem beabsichtigten Ergebnis. Ein Fehlwertindikator hält Schätzwerte sichtbar; eine sortierte, schlüsselbasierte Dublettenprüfung macht die gewählte Datensatzversion sichtbar.
Speichere zurückgegebene Objekte durch direkte Zuweisung. Unter Copy-on-Write in pandas 3 aktualisiert ein verketteter
inplace-Aufruf auf einer ausgewählten Spalte nicht den übergeordneten DataFrame.
2Codes und Messwerte transformieren
15 Schritte
Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.
- 1EinführungDie Bedeutung der Ausgabe festlegen
- 2BeispielEinen Wert zuordnen oder ändern
- 3BeispielText nach der Bereinigung seines Formats umwandeln
- 4KernaussageÜberschriften von Zellen unterscheiden
- 5HerausforderungDie Ursache einer neuen Lücke finden
- 6BeispielDie Enden eines Intervalls lesen
- 7ErklärungDie niedrigste Grenze gezielt einschließen
- 8VerbindungBreiten oder Besetzungszahlen wählen
- 9HerausforderungDie Regel für die Intervallgrenzen testen
- 10BeispielVor dem Dividieren das Minimum abziehen
- 11BeispielDen Abstand vom Mittelwert messen
- 12TippBegrenzen, ohne eine Beobachtung zu löschen
- 13ErklärungKategoriezugehörigkeit darstellen
- 14HerausforderungEine Indikatorzeile mit ausschließlich falschen Werten erklären
- 15ZusammenfassungDie erzeugte Darstellung prüfen
3Uneinheitlichen Text in nutzbare Bezeichnungen umwandeln
17 Schritte
Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.
- 1EinführungText eine einheitliche Struktur geben
- 2ErklärungEine Methode auf jede Zeichenkette anwenden
- 3BeispielNur dort aufteilen, wo das Format es verlangt
- 4TippEine einfache Textsuche wörtlich durchführen
- 5HerausforderungEinen Textschlüssel für einen Verbund vorbereiten
- 6ErklärungEin Muster für Mengenangaben erstellen
- 7BeispielDie erste Mengenangabe extrahieren
- 8VerbindungAlle Übereinstimmungen wählen, wenn eine nicht genügt
- 9HerausforderungEine teilweise Codeübereinstimmung zurückweisen
- 10TippBegrenzen, was ein Muster erfasst
- 11BeispielDie Bezeichnungsliste von ihren Codes unterscheiden
- 12ErklärungGrößen ihre vorgesehene Reihenfolge geben
- 13TippVor dem Zuweisen einer neuen Bezeichnung Platz schaffen
- 14HerausforderungLeere Kategorien sichtbar halten
- 15VerbindungKategorien über Datenblöcke hinweg kombinieren
- 16HerausforderungVor dem Festlegen der erlaubten Liste bereinigen
- 17ZusammenfassungTextwerte und Speicherung untersuchen
4Tabellen kombinieren und jede Zeile berücksichtigen
18 Schritte
Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.
- 1EinführungDie Beziehung zwischen den Tabellen bestimmen
- 2BeispielDen gemeinsamen Schlüssel ausdrücklich angeben
- 3ErklärungDie benötigte Seite erhalten
- 4KernaussageJedes passende Paar erwarten
- 5TippDie Beziehung zu einer geprüften Regel machen
- 6BeispielNicht zugeordnete Schlüssel getrennt zählen
- 7HerausforderungDie Ursache zusätzlicher Zeilen finden
- 8BeispielEine linke Spalte mit einem rechten Index abgleichen
- 9TippGleichnamige Spalten unterscheiden
- 10BeispielDer Hauptquelle Vorrang geben
- 11VerbindungBeim Addieren von Werten den Bezeichnungen folgen
- 12HerausforderungDie richtige Beobachtung ergänzen
- 13BeispielBeobachtungen anhand übereinstimmender Spaltennamen hinzufügen
- 14ErklärungEine Herkunftsbezeichnung behalten oder einen neuen Index erstellen
- 15KernaussageBeim Hinzufügen von Spalten Zeilen ausrichten
- 16HerausforderungNeue Lücken bei Entfernungen untersuchen
- 17HerausforderungDatenblöcke vor dem Hinzufügen von Zuordnungsdaten kombinieren
- 18ZusammenfassungHinzugefügte Zeilen und Zuordnungen nachvollziehen
5Werte umformen und ihre Bezeichnungen erhalten
18 Schritte
Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.
- 1EinführungDie Identität jedes Messwerts verfolgen
- 2BeispielEiner Zeile zwei Bezeichnungen geben
- 3ErklärungDie tatsächlich gemeinte Ebene auswählen
- 4TippNach dem Ändern der Ebenenrollen sortieren
- 5HerausforderungEine innere Ebene auswählen, ohne die Daten zu ändern
- 6BeispielJahresspalten in den Index verschieben
- 7ErklärungDie Ebene wählen, die zu Spalten wird
- 8KernaussageEine neu sichtbare Lücke erkennen
- 9HerausforderungDen Grund für das Scheitern der Umformung ins Breitformat finden
- 10VerbindungFür die nächste Aufgabe Lang- oder Breitformat wählen
- 11BeispielEin eindeutiges Paar in eine Zelle pivotieren
- 12ErklärungNur aggregieren, wenn es beabsichtigt ist
- 13BeispielMesswerte mit melt umformen und Kennungen behalten
- 14TippPrüfen, welchen Typ eine Spaltenbezeichnung annimmt
- 15HerausforderungEine fehlende Zelle im Breitformat wiederherstellen
- 16VerbindungEine Tabelle für Spaltenoperationen wiederherstellen
- 17HerausforderungDie Korrektur für wiederholte Messwerte wählen
- 18ZusammenfassungForm, Eindeutigkeit und Bedeutung prüfen
Datenaufbereitung mit pandas: Übungsaufgaben
Set 1: Daten lesen und einfache Änderungen vorhersagen10 Übungsfragen
Frage 1 von 10
NaN und 12. Wie lautet ihr standardmäßig berechneter Mittelwert?Antwort zeigenAntwort ausblenden
len zählt Positionen; der standardmäßige Mittelwert überspringt Lücken.Frage 2 von 10
df.isna().any(axis=1).sum()?Antwort zeigenAntwort ausblenden
Frage 3 von 10
item, mass_kg und note. Zeile U hat eine bekannte Masse und eine fehlende Notiz; Zeile V hat eine fehlende Masse und eine bekannte Notiz. Beide Artikelnamen sind bekannt. Was behält df.dropna(subset=["mass_kg"])?Antwort zeigenAntwort ausblenden
Frage 4 von 10
s.map({"A": "active", "B": "blocked"})?Antwort zeigenAntwort ausblenden
replace mit diesem Dictionary. Ein an map übergebenes Dictionary legt Ausgaben für die gesamte Zuordnung fest, nicht nur Änderungen ausgewählter Werte.Frage 5 von 10
pd.cut(x, [0, 10, 20]) übergeben. Wohin gelangt 10?Antwort zeigenAntwort ausblenden
right=False erfordert.Frage 6 von 10
s.str.strip().str.lower()?Antwort zeigenAntwort ausblenden
Frage 7 von 10
str.contains(r"\d+") und str.fullmatch(r"\d+") ihn?Antwort zeigenAntwort ausblenden
Frage 8 von 10
Antwort zeigenAntwort ausblenden
Frage 9 von 10
id, km. Datenblock B mit drei Zeilen hat die Spalten id, km, flag. Welche Form ergibt pd.concat([a, b], ignore_index=True)?Antwort zeigenAntwort ausblenden
join="inner" erfordern; das Zurücksetzen des Index verwirft keine zusätzliche Spalte.Frage 10 von 10
station, dry und wet. Welche Länge ergibt das Umformen der zwei Messwertspalten mit id_vars="station"?Antwort zeigenAntwort ausblenden
Set 2: Methoden für häufige Aufgaben der Datenaufbereitung wählen10 Übungsfragen
Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.
Frage 1 von 10
drop_duplicates(subset="id", keep=False)?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 2 von 10
NaN, NaN, 11,0. Was ergibt ffill(limit=1)?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 3 von 10
pd.to_numeric(..., errors="coerce")?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 4 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 5 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 6 von 10
s.replace("Rd", "Road")?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 7 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 8 von 10
NaN; Series b hat q = 9, r = 2. Was ergibt a.combine_first(b)?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 9 von 10
.loc["C"], um Summen nach Standort für Monat 6 zu erhalten. Welche Korrektur erhält die Messwerte und ergibt die benötigten Summen?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 10 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Set 3: Bezeichnungen, Schlüssel und sich ändernde Formen verfolgen10 Übungsfragen
Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.
Frage 1 von 10
"", " " und None, die direkt im Speicher erstellt wurden. Wie viele Werte zählt s.isna().sum()?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 2 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 3 von 10
qcut-Gruppen?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 4 von 10
s.str.extract(r"(\d+)\s*kg", expand=False) mit anschließender numerischer Umwandlung zurück?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 5 von 10
["small", "large"] umgewandelt und dann mit dropna=False ausgezählt. Welche Anzahlen erscheinen?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 6 von 10
_merge-Zeilenanzahlen für both, left_only und right_only?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 7 von 10
x.add(y, fill_value=0) die Summe der resultierenden Werte?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 8 von 10
.loc[2027] nach swaplevel("city", "year").sort_index() aus?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 9 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 10 von 10
pivot_table mit Standort als Zeilen, Jahr als Spalten und der Standardaggregation, wenn anschließend die eine Jahresspalte mit melt umgeformt wird?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Set 4: Änderungen in einem Bereinigungsablauf untersuchen10 Übungsfragen
Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.
Frage 1 von 10
NaN. Du speicherst einen Fehlwertindikator und füllst dann die Lücke mit dem Median der Spalte. Welcher Wert wird eingesetzt und wie viele Indikatorwerte sind wahr?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 2 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 3 von 10
None, „ 9 “. Wie viele ursprünglich vorhandene Werte sind nach to_numeric(errors="coerce") zu fehlenden Werten geworden?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 4 von 10
cut mit den Grenzen [0, 10, 20] und standardmäßigen Indikatoren enthalten zwei Zeilen ausschließlich falsche Werte. Gültige Massen sollen Kategorien zugeordnet und unbekannte Messwerte getrennt erkennbar sein. Welche Korrektur passt?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 5 von 10
s.str.split("/", n=1, expand=True) mit „zone/aisle/bin“?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 6 von 10
r"(\d+)" extrahieren und umwandeln. Welche numerischen Werte bleiben?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 7 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 8 von 10
id, km. Tabelle b hat eine Zeile mit den Spalten id, Km. Wie viele Zellen fehlen nach dem Aneinanderfügen der Zeilen mit standardmäßiger Spaltenbehandlung insgesamt in den beiden Entfernungsspalten?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 9 von 10
.loc[2026] und pivotiert dann. Welche Korrektur wählt die Daten aus und erzeugt eine einzelne Berichtszeile?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 10 von 10
site, day und night. Eine Nachtzelle fehlt. Wie lauten nach dem Umformen beider Messwertspalten mit melt, dem Entfernen fehlender Werte und dem Zurückpivotieren die Anzahl langer Zeilen und die Anzahl fehlender Zellen im Breitformat?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Set 5: Verknüpfte Transformationen durchdenken10 Übungsfragen
Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.
Frage 1 von 10
NaN und 6. Ihre Dokumentation definiert -99 als fehlend und 0 als echten Messwert. Wie lauten nach der Bereinigung die Anzahl bekannter Werte und der Mittelwert?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 2 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 3 von 10
{"a": "4", "b": "bad"} zu und wendet dann eine numerische Typumwandlung mit Fehlerersetzung an. Welche ursprünglichen Einträge fehlen am Ende und warum?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 4 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 5 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 6 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 7 von 10
NaN; die Ersatzwerte sind a = 50, b = 7, c = 9. Was würde sich nach primary.combine_first(backup) ändern, wenn die Priorität der Quellen umgekehrt würde?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 8 von 10
kg und count, beide mit dem Datentyp "Int64" mit Fehlwertunterstützung. Ein dritter hat nur kg mit diesem Datentyp. Was erklärt nach dem Aneinanderfügen der Zeilen die entstehende count-Spalte am besten?Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 9 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Frage 10 von 10
Antwort zeigenAntwort ausblenden
Speichere diese Einheit, um diese Antwort zu sehen.
Hängst du bei deiner eigenen Aufgabe fest? Hausaufgabenhilfe
Schlüsselbegriffe
A
Achse
Aufteilen von Zeichenketten
Ausrichtung anhand von Indexbezeichnungen
B
Breitformat
C
combine_first
combine_first, um fehlende Messwerte aus einer Ersatzquelle zu ergänzen und dabei bekannte Werte der Hauptquelle zu behalten.Copy-on-Write
D
Datensatzschlüssel
Datentyp mit Fehlwertunterstützung
"Int64" für ganze Zahlen mit pd.NA.Doppelte Zeile
dropna
dropna(subset=["mass_kg"]), wenn nutzbare Zeilen eine Masse haben müssen, selbst wenn ein anderes Feld unvollständig ist.E
Eindeutigkeit
Erfassungsgruppe
F
Fehlende Kombination
NaN, wenn die langen Messwerte mit unstack umgeformt werden.Fehlender Wert
rain_mm bedeutet, dass der Messwert nicht verfügbar ist, und muss daher von ausbleibendem Regen unterschieden werden.Fehlwertmaske
G
Geordnete kategoriale Daten
Gierige Wiederholung
r"<.*>" kann in einer kurzen Zeichenkette mit Auszeichnungen beide Tags und den Text dazwischen umfassen.H
Herkunftsschlüssel
concat übergebener Herkunftsschlüssel wird zu einer äußeren Indexbezeichnung, die den Teil identifiziert, aus dem jede Zeile oder Spalte stammt.I
id_vars
id_vars="station" hält Stationsnamen aus den numerischen Messwerten heraus, die durch melt entstehen.ignore_index
ignore_index=True, wenn Monatsdateien entbehrliche Zeilennummern haben, die sich sonst wiederholen würden.Imputation
Indexbasierter Verbund
join nutzt den rechten Index auch dann, wenn eine linke Schlüsselspalte angegeben wird.Indexebene
loc-Auswahl mit einer einzelnen Bezeichnung verwendet wird.Indexsortierung
Indikatorspalte
get_dummies erstellte Indikatorspalte für „blue“ ist nur für Zeilen mit der Bezeichnung blue wahr.Innerer Verbund
Interpolation
NaN, 12 die Werte 8, 10, 12, wenn eine geradlinige Schätzung passt.K
Kategorialer Datentyp
Kategoriecode
Klasse
(0, 10] geschrieben wird, ist der Messwert 10 eingeschlossen und der Messwert 0 ausgeschlossen.L
Langformat
Leerraumzeichen
str.strip() bereinigt werden.Linker äußerer Verbund
Literaler Musterabgleich
M
map
map für Ländercodes macht Codes, die im Dictionary fehlen, als Lücken sichtbar, die der Analyst untersuchen kann.melt
melt von vier Jahresspalten erzeugt vier Zeilen pro Stadt, einschließlich Zeilen für leere Messwertzellen.Min-Max-Skalierung
MultiIndex
N
NaN
isna(), um NaN in der Temperaturspalte zu finden, bevor du die für einen Mittelwert verfügbaren Messwerte zählst.NaT
isna() erkennt es ebenso wie fehlende numerische Messwerte.P
pivot
pivot von Station und Monat verlangt einen Messwert für jede Stations-Monats-Zelle in der Ausgabe.pivot_table
pivot_table mit aggfunc="sum", wenn getrennte Lieferungen zu einer Tagessumme addiert werden sollen.Q
Quantilbasierte Klasseneinteilung
qcut, um Gruppen mit niedrigen, Werten im mittleren Bereich und hohen Messwerten bei ähnlicher Besetzungszahl zu vergleichen.Querschnitt
R
Raw-String
r, die umgekehrte Schrägstriche etwa für Muster regulärer Ausdrücke erhält.r"\d+", damit sein umgekehrter Schrägstrich bei der Verarbeitung des regulären Ausdrucks ankommt.Regulärer Ausdruck
rename
rename(columns={"Weight": "mass_kg"}), um einer Überschrift eine klare Bedeutung zu geben, ohne ihre Zellen zu ändern.replace
replace-Dictionary kann „pending“ in „open“ ändern, ohne die anderen Statuswerte zu verändern.reset_index
reset_index(level="year"), um das Jahr als Spalte wiederherzustellen und die Stadt im Index zu belassen.Rückwärtsauffüllen
S
stack
stack auf einer Stadttabelle mit Jahresspalten ergibt Stadt-Jahr-Indexpaare für dieselben Umsatzwerte.str-Accessor
s.str.lower(), um eine ganze Städtespalte mit einem Ausdruck kleinzuschreiben.subset
subset="order_id", um wiederholte Bestellschlüssel zu erkennen, selbst wenn sich ihre erfassten Gewichte unterscheiden.Suffix
_sensor unterscheidet eine Messwertspalte von der gleichnamigen Spalte in einer Ersatztabelle.T
Typumwandlung
Typumwandlung mit Fehlerersetzung
to_numeric wandelt lesbare Werte in Zahlen um und macht unlesbare Einträge zu fehlenden Werten, statt einen Fehler auszulösen.U
Umformen
Unbenutzte Kategorie
unstack
unstack("year"), um jedes Jahr für jede Stadt in eine separate Umsatzspalte zu setzen.V
Vektorisierte Operation
Verbund (Merge)
Verbundindikator
Vereinheitlichung der Groß- und Kleinschreibung
Vereinigung von Kategorien
Verkettung
Viele-zu-eins-Beziehung
Vollständige Übereinstimmung
r"\d+" akzeptiert „204“ und weist „204x“ zurück, obwohl beide Zeichenketten Ziffern enthalten.Vollständiger äußerer Verbund
Vorwärtsauffüllen
W
Wertbegrenzung
Z
z-Wert
Zeichenklasse
\d oder einen Bereich wie [A-Z].[A-Z] passt auf einen Großbuchstaben vor den Ziffern eines Inventarcodes.Über diese Einheit
Erstelle deine eigenen Lernmaterialien
Mach aus deinen Notizen, Folien und Dokumenten Lernleitfäden, Übungsfragen, Karteikarten und 6 weitere Tools.