Daten laden und speichern in pandas

Lerne, Daten aus Formaten, die in der Datenanalyse täglich vorkommen, in pandas zu laden und ohne Informationsverlust wieder zu speichern. Lies CSV- und andere Textdateien mit den richtigen Trennzeichen, Zahlenformaten, Fehlwertkennzeichen, Datumsformaten und Zeichenkodierungen ein, auch Berichte mit Titelzeilen und Fußbereichen. Lade Excel-Arbeitsmappen und JSON-Dateien, rufe Daten über Web-APIs ab, speichere Ergebnisse als CSV, Excel und Parquet und lies und schreibe Daten in SQL-Datenbanken mit sicheren parametrisierten Abfragen.

MittelEinheit 3 von 8 in Kurs: Datenanalyse mit Python – NumPy, pandas und Matplotlib

Was du lernst

  1. Lies CSV- und andere Textdateien mit Trennzeichen mit pd.read_csv ein, steuere, wie pandas die Spalten aufteilt, bezeichnet und ihre Datentypen festlegt, und prüfe das Ergebnis vor der Analyse.
    • Eine CSV-Datei einlesen und das Ergebnis in pandas prüfen
      Lade eine kommagetrennte Datei in einen DataFrame, wähle Kopfzeile, Spaltennamen, Index und die zu behaltenden Spalten und prüfe die von pandas ermittelten Typen.
    • Trennzeichen und regionale Zahlenformate berücksichtigen
      Erkenne Trennzeichen, Dezimaltrennzeichen und Tausendertrennzeichen einer Datei und lege sep, decimal und thousands so fest, dass Zahlen als Zahlen geladen werden.
    • Beim Einlesen fehlende Werte, Spaltentypen und Datumsangaben festlegen
      Teile pandas mit, welche Kennzeichen für fehlende Werte stehen, behalte Kennungen als Text, wähle numerische Typen und lies Datumsangaben mit einem expliziten Format ein.
    • Dateien mit unregelmäßigem Aufbau einlesen
      Überspringe Titelzeilen, Kommentare und Fußbereiche, lies mehrzeilige Kopfzeilen und Spalten mit fester Feldbreite ein und entscheide, wie du mit fehlerhaften Zeilen umgehst.
  2. Verstehe, wie Text als Bytes gespeichert wird, behebe Kodierungsfehler und Zeichensalat und lies Dateien, die zu groß sind oder sich zu langsam in einem Stück laden lassen.
    • Verstehen, wie Zeichen als Bytes dargestellt werden
      Erkläre, was eine Zeichenkodierung ist, und erkenne ASCII, UTF-8, Latin-1, Windows-1252, UTF-16 und die Byte Order Mark.
    • Probleme mit der Zeichenkodierung erkennen und beheben
      Erkenne Dekodierungsfehler und Zeichensalat, finde die richtige Zeichenkodierung und schreibe Dateien, die andere Programme korrekt lesen.
    • Große und komprimierte Textdateien effizient einlesen
      Verringere den Speicherbedarf beim Einlesen, verarbeite eine Datei in Datenblöcken, kombiniere Teilergebnisse korrekt und lies komprimierte Dateien direkt ein.
  3. Lies Daten aus Arbeitsblättern mit Titeln, verbundenen Zellen und Formeln und schreibe einen oder mehrere DataFrames für andere Personen in eine Arbeitsmappe.
    • Arbeitsblätter aus Excel-Arbeitsmappen einlesen
      Wähle das Arbeitsblatt sowie die einzulesenden Zeilen und Spalten und erfahre, wie pandas mit Datumsangaben, Formeln, verbundenen Zellen und Formatierungen umgeht.
    • DataFrames in Excel-Arbeitsmappen schreiben
      Speichere eine oder mehrere Tabellen in einer Arbeitsmappe, die andere öffnen können, und vermeide es, Daten zu überschreiben oder falsch zu bezeichnen.
  4. Lies und schreibe JSON, wandle verschachtelte Datensätze in Tabellen um und fordere Daten zuverlässig und sicher über Web-APIs an.
    • JSON-Daten lesen und schreiben
      Kenne die Syntax von JSON und ihre Zuordnung zu Python-Objekten und lies und schreibe JSON und JSON Lines mit Python und pandas.
    • Verschachtelte JSON-Daten in eine flache Tabelle umwandeln
      Wandle verschachtelte Objekte und Listen mit pd.json_normalize in Spalten und Zeilen um und entscheide, was eine Zeile darstellt.
    • Daten über eine Web-API anfordern
      Rufe eine API mit der Bibliothek requests auf, prüfe die Antwort, gehe mit Schlüsseln, Seiten und Anfrageratenbegrenzungen um und lies Tabellen von Webseiten ein.
  5. Schreibe bereinigte Ergebnisse in CSV, vergleiche Text- und Binärformate und nutze Parquet, um Daten zwischen Analyseschritten kompakt und mit den richtigen Datentypen zu speichern.
    • DataFrames in CSV- und Textdateien schreiben
      Steuere Index, fehlende Werte, Zahlen- und Datumsformate sowie die Zeichenkodierung geschriebener Dateien und bewahre Rohdaten sicher auf.
    • Textbasierte und binäre Speicherformate vergleichen
      Erkläre die Unterschiede zwischen Textformaten sowie zeilen- und spaltenorientierten Binärformaten und wähle CSV, Excel, JSON, Parquet, Feather, pickle oder eine Datenbank für eine bestimmte Aufgabe.
    • Parquet-Dateien lesen und schreiben
      Speichere DataFrames mit ihren Typen in Parquet, lies ausgewählte Spalten und organisiere Daten als partitionierten Datenbestand.
  6. Verbinde pandas mit einer Datenbank, lade Abfrageergebnisse mit Parametern und korrekten Typen und schreibe DataFrames sicher in Tabellen.
    • Eine Datenbankverbindung herstellen und Abfrageergebnisse laden
      Öffne eine Verbindung zu SQLite oder einer anderen Datenbank, führe eine vorgegebene SQL-Abfrage aus pandas aus und verwalte Zugangsdaten und Verbindungen.
    • Abfrageparameter sicher übergeben und Datentypen der Ergebnisse festlegen
      Setze Werte mithilfe von Parametern statt durch Zeichenkettenformatierung in Abfragen ein und erhalte korrekte Datumswerte, Ganzzahlen und Datenblockgrößen im Ergebnis.
    • DataFrames in Datenbanktabellen schreiben
      Erstelle, ergänze und ersetze Tabellen mit to_sql, wähle Spaltentypen und prüfe und wiederhole Schreibvorgänge sicher.

Daten laden und speichern in pandas einfach erklärt

6 Kapitel

1

Textdateien mit Trennzeichen in pandas laden

Textdateien können wie Tabellen aussehen und dabei wichtige Fragen offenlassen. Du liest Datensätze in pandas ein, prüfst die entstehenden Zeilen und Spalten und wählst Optionen für Kopfzeilen, Felder in Anführungszeichen, Zahlenschreibweisen, Fehlwertkennzeichen und Datumsangaben. Außerdem findest du die eigentlichen Beobachtungen in Berichten mit Titeln, Kommentaren und Summen, sodass der abgeschlossene Import die beabsichtigte Tabelle und die richtigen Werte liefert.

Nutzt du Excel auf Englisch? Dann tippst du Kommas statt Semikolons und diese Namen: SUMME ist SUM.

1.1 Von CSV-Datensätzen zur geprüften Tabelle

Eine CSV-Datei ist reiner Text, der in Datensätze und Felder gegliedert ist. Meist trennen Kommas die Felder und der erste Datensatz liefert häufig die Spaltennamen. Die Datei enthält Zeichen, kein pandas-Schema. Beim Einlesen musst du daher auch entscheiden, wofür diese Zeichen stehen.

Eine kleine Datei laden und untersuchen

Angenommen, eine Datei enthält:

order_id,date,region,units,price
1001,2026-03-02,North,3,4.50
1002,2026-03-02,South,1,12.00
1003,2026-03-03,North,2,7.25

Lies sie ein und untersuche das Ergebnis:

import pandas as pd

df = pd.read_csv("sales.csv")
print(df.head())
print(df.shape)
print(df.dtypes)
df.info()

Die Form ist (3, 5): drei Datenzeilen und fünf Spalten. pandas ermittelt int64 für order_id und units sowie float64 für price. Die Spalte date enthält weiterhin Text. In pandas 3 zeigen automatisch erkannte Textspalten normalerweise str; ältere pandas-Versionen zeigen häufig object.

Jede Prüfung beantwortet eine andere Frage. head() zeigt, ob die Felder zu ihren Bezeichnungen passen. shape deckt fehlende Zeilen oder eine unerwartete zusätzliche Spalte auf. dtypes prüft die Interpretation und info() ergänzt die Anzahl nicht fehlender Werte. Wird eine für Zahlen vorgesehene Spalte als Text geladen, lohnt sich ein Blick auf die Rohwerte: Eine Einheit, ein Platzhalter oder eine andere Dezimalschreibweise kann die Erkennung als numerischer Typ verhindern.

Bezeichnungen den Datensätzen zuordnen

Für eine Datei ohne Kopfzeile, deren erste Zeile 1001,North,3 ist, verwende:

df = pd.read_csv(
    "orders.txt",
    header=None,
    names=["id", "region", "units"]
)

Ohne diese Einstellung verwendet pandas den ersten Datensatz als Kopfzeile. Seine Werte werden zu Spaltennamen und der Datensatz verschwindet aus den Daten. Verwende index_col="order_id", wenn eine vorhandene Spalte die Zeilen bezeichnen soll. Verwende usecols=["region", "units"], um nur diese Spalten einzulesen, oder nrows=1000, um die ersten 1.000 Datenzeilen zu untersuchen, bevor du eine große Datei lädst.

Anführungszeichen vom CSV-Parser verarbeiten lassen

Der Datensatz "Smith, Jane",Boston,10 hat drei Felder. Das Komma innerhalb des Namens in Anführungszeichen gehört zu diesem Namen. Zwei doppelte Anführungszeichen innerhalb eines Feldes in Anführungszeichen stehen für ein einzelnes doppeltes Anführungszeichen als Inhalt: "O'Neil ""Red""" wird zu O'Neil "Red". Ein solches Feld kann sogar einen Zeilenumbruch enthalten, sodass Datensätze und tatsächliche Zeilen nicht immer übereinstimmen.

Der Aufruf line.split(",") zerschneidet den Namen und kann diese Regeln nicht berücksichtigen. read_csv berücksichtigt sie beim Einlesen. pd.read_table verwendet standardmäßig den Tabulator als Trennzeichen; pd.read_fwf verarbeitet Felder, die durch Zeichenpositionen definiert sind.

Die Datei finden, die Python sucht

Ein relativer Pfad wird vom aktuellen Arbeitsverzeichnis des Programms aus aufgelöst. Kann "data/sales.csv" nicht gefunden werden, prüfe das Arbeitsverzeichnis nach from pathlib import Path mit Path.cwd(). An read_csv lassen sich auch ein absoluter Pfad, ein Path-Objekt, eine URL oder eine Textdatei im Arbeitsspeicher wie StringIO übergeben. Prüfe den Speicherort, bevor du Leseoptionen änderst: Eine fehlende Datei und eine falsch eingelesene Datei sind verschiedene Probleme.

Wichtige Erkenntnisse

  • CSV speichert Zeichen; pandas ermittelt die Spaltentypen beim Einlesen.
  • Prüfe nach einem Import die ersten Zeilen, die Form, die Typen und die Anzahl nicht fehlender Werte.
  • Verwende header=None und names, wenn die Datei keine Kopfzeile hat.
  • Trennzeichen und Zeilenumbrüche innerhalb von Anführungszeichen gehören zu den Feldern; verwende einen CSV-Parser.
  • Relative Pfade gehen vom aktuellen Arbeitsverzeichnis aus.

1.2 Trennzeichen und korrekt eingelesene Zahlen

Ein Trennzeichen trennt Felder; ein Dezimaltrennzeichen trennt den ganzzahligen Teil einer Zahl von ihrem Nachkommateil. Ein Tausendertrennzeichen gruppiert Ziffern. Diese drei Aufgaben benötigen separate Einstellungen, selbst wenn dasselbe Zeichen in verschiedenen Dateien unterschiedliche Aufgaben erfüllt.

Zeichen vor der Wahl der Optionen untersuchen

Sieh dir einige Rohzeilen in einem Editor an. Die Endung .csv garantiert keine Kommas und .txt verrät den Aufbau nicht. Häufige Einstellungen sind:

DateiaufbauLeseoption
Tabulatorgetrennte Feldersep="\t"
Felder mit senkrechtem Strich als Trennzeichen`sep="
Durch mehrere Leerzeichen getrennte Feldersep=r"\s+"
Semikolongetrennte Feldersep=";"

Du kannst den Anfang untersuchen, ohne die ganze Datei einzulesen:

with open("products.csv", encoding="utf-8") as f:
    print(f.readline())
    print(f.readline())
Einen regionalen Export durchgehen

Betrachte diesen Text:

product;price;qty
Tea;3,50;1.200
Coffee;12,90;850

Die Semikolons trennen Felder, das Komma ist das Dezimaltrennzeichen und der Punkt gruppiert Tausender. Gib beim Einlesen alle drei Konventionen ausdrücklich an:

df = pd.read_csv(
    "products.csv",
    sep=";",
    decimal=",",
    thousands="."
)

Die Preise werden zu 3,5 und 12,9. Die Mengen werden zu 1200 und 850. Mit dem standardmäßigen Komma als Trennzeichen beschreibt diese Kopfzeile keine drei kommagetrennten Spalten. Selbst nach der Wahl von sep=";" ist die Aufgabe noch nicht erledigt: Die Preise bleiben Text und "1.200" kann zur Dezimalzahl 1,2 werden. Dieses letzte Ergebnis ist eine gültige Zahl mit der falschen Bedeutung. Für einen schwerwiegenden Fehler muss daher keine Ausnahme beim Einlesen auftreten.

Vergleiche einige geladene Werte mit ihrem Quelltext und untersuche describe() auf unplausible Wertebereiche. Eine Menge, die im Tausenderbereich erwartet wird und nahe eins erscheint, deutet auf ein Problem mit der Zahlenschreibweise hin. Das Trennzeichen allein zu ändern, behebt es nicht.

Feldgrenzen von der Zahlengruppierung unterscheiden

In einer kommagetrennten Datei muss eine gruppierte Zahl wie "1,234.50" in Anführungszeichen stehen. Das Komma innerhalb des Feldes gehört zur Zahl. Mit thousands="," kann pandas das Feld in Anführungszeichen als 1234,5 einlesen. Ohne Anführungszeichen erzeugt das Komma auch eine Feldgrenze; thousands kann die verlorene Datensatzstruktur nicht wiederherstellen.

Einen passenden Parser wählen

Der standardmäßige C-Parser verarbeitet übliche Dateiaufbauten schnell. Der Python-Parser unterstützt die Erkennung von Trennzeichen mit sep=None, reguläre Ausdrücke als Trennzeichen und skipfooter. Die Erkennung untersucht eine Stichprobe und kann bei einem unregelmäßigen Bericht falsch liegen. Gib daher ein bekanntes Trennzeichen direkt an.

Ein Trennzeichen mit mehr als einem Zeichen wird im Allgemeinen als regulärer Ausdruck behandelt und benötigt den Python-Parser; r"\s+" ist ein Sonderfall, den auch der C-Parser unterstützt. Der PyArrow-Parser kann mit parallelen Threads einlesen, unterstützt aber andere Optionen. Zum Beispiel wird chunksize mit engine="pyarrow" nicht unterstützt. Wähle den Parser nach den Optionen, die deine Datei benötigt, und prüfe anschließend Struktur und Werte des Ergebnisses.

Wichtige Erkenntnisse

  • Wähle sep, decimal und thousands für ihre jeweiligen Aufgaben.
  • Ein numerisch aussehendes Ergebnis kann trotzdem um den Faktor 1.000 falsch sein.
  • Setze ein Feld in Anführungszeichen, wenn sein Inhalt das Trennzeichen enthält.
  • Der Python-Parser unterstützt die Erkennung und skipfooter; die Optionen der Parser unterscheiden sich.

1.3 Fehlende Werte, Kennungen und Datumsangaben

Die Typinferenz kann nicht wissen, ob 999 ein Messwert oder ein Code für einen unbekannten Wert ist. Sie kann auch nicht wissen, ob führende Nullen eine Bedeutung haben. Nutze die Definitionen der Daten, um Leseoptionen festzulegen, bevor die Typinferenz diese Werte verändert.

Fehlwertkennzeichen dort festlegen, wo sie gelten

pandas erkennt leere Felder und integrierte Kennzeichen wie "NA", "N/A", "n/a", "NULL", "NaN" und "None". Eine Quelle kann zusätzliche Kennzeichen verwenden. Angenommen, score enthält 88, "n/a", "-" und 999, wobei 999 als unbekannt definiert ist:

df = pd.read_csv(
    "scores.csv",
    na_values={"score": ["-", "999"]}
)

Die Spalte mit den Punktzahlen enthält nun 88,0 und drei fehlende Werte. Ohne Deklaration der Kennzeichen kann "-" dazu führen, dass die Spalte Text bleibt; ein nicht deklarierter numerischer Sentinelwert kann in Berechnungen eingehen. Der Mittelwert von 88 und 999 ist 543,5, obwohl die einzige bekannte Punktzahl 88 ist.

Ein Dictionary beschränkt ein Kennzeichen auf seine Spalte. Ein dateiweites na_values=["999"] würde auch einen tatsächlichen Produktcode 999 entfernen. Ist "NA" eine tatsächliche Bezeichnung, schalte mit keep_default_na=False die integrierte Liste der Kennzeichen ab und führe die Kennzeichen, die tatsächlich fehlende Werte bedeuten, ausdrücklich auf. Nimm bei dieser Einstellung "" auf, wenn leere Felder weiterhin als fehlend zählen sollen.

Werte entsprechend ihrer Rolle erhalten

Lies Kennungen als Text ein:

df = pd.read_csv(
    "visits.csv",
    dtype={"site_code": str, "visits": "Int64"}
)

Ein Code wie "00501" muss fünf Zeichen lang bleiben. Als Ganzzahl eingelesen ergibt er 501; wandelst du diese Ganzzahl später in Text um, entsteht "501", nicht der ursprüngliche Code. Verwende einen numerischen Typ für Werte, mit denen du rechnest.

Gewöhnliche NumPy-Ganzzahlspalten können kein NaN enthalten, daher wird eine Zählspalte mit einer Lücke oft zu float64. Das pandas-"Int64" mit Fehlwertunterstützung und großem I behält Ganzzahlwerte und stellt eine Lücke mit <NA> dar. dtype_backend="numpy_nullable" fordert für das gesamte Ergebnis Typen mit Fehlwertunterstützung an. Bei einer kleinen Anzahl wiederholter Bezeichnungen speichert dtype={"region": "category"} die Bezeichnungen als Kategorien und kann den Speicherbedarf senken.

Die Schreibweise von Datumsangaben festlegen

Text, der wie ein Datum aussieht, bleibt Text, bis er als Datum eingelesen wird. Verwende für Datumsangaben mit dem Tag zuerst wie "03/04/2026" und "13/04/2026":

df = pd.read_csv(
    "events.csv",
    parse_dates=["day"],
    date_format="%d/%m/%Y"
)

Diese Werte werden zum 3. beziehungsweise 13. April. Ohne Format kann eine Annahme mit dem Monat zuerst entweder gültige Tage und Monate vertauschen oder die Umwandlung der Spalte scheitern lassen. dayfirst=True gibt eine bevorzugte Reihenfolge an; ein explizites Format legt den erwarteten Aufbau fest. ISO-Datumsangaben wie "2026-04-03" vermeiden Mehrdeutigkeit bei Tag und Monat.

Untersuche nach dem Einlesen dtypes, isna().sum() und die Zeilenanzahl. Prüfe ein Datum, dessen Interpretation sich zwischen den Konventionen unterscheidet. Zeigt eine Spalte weiterhin Text, hat das Einlesen nicht die beabsichtigten Datums- und Zeitwerte erzeugt; eine unerwartet gestiegene Anzahl fehlender Werte kann darauf hinweisen, dass eine tatsächliche Bezeichnung für ein Fehlwertkennzeichen gehalten wurde.

Wichtige Erkenntnisse

  • Deklariere quellenspezifische Fehlwertkennzeichen, vorzugsweise pro Spalte.
  • Verwende keep_default_na=False, wenn ein integriertes Fehlwertkennzeichen einen tatsächlichen Wert darstellt.
  • Lies Kennungen, die nur aus Ziffern bestehen, als Text ein, um führende Nullen zu erhalten.
  • Verwende Int64 mit Fehlwertunterstützung für ganzzahlige Anzahlen mit fehlenden Werten.
  • Gib für mehrdeutige Datumsangaben ein explizites Format an und prüfe ihren Datentyp.
  • Vergleiche die Anzahl fehlender Werte mit der Quelle.

1.4 Tabellen in Berichten und Dateien mit fester Feldbreite

Ein Bericht kann eine Tabelle mit Titeln, Leerzeilen, Kommentaren, Summen und Quellenangaben verbinden. Finde zuerst die Kopfzeile und die Grenzen der Daten. Andernfalls kann eine Lesefunktion einen Titel für Spaltennamen halten oder eine Summe als gewöhnliche Beobachtung einbeziehen.

Nur die Tabelle einlesen

Ein Bericht enthält diese neun tatsächlichen Zeilen:

Monthly sales report
Exported 2026-04-01

region,jan,feb
North,120,135
# test row below
South,98,101
Total,218,236
Source: internal system

Die ersten drei Zeilen stehen vor der Kopfzeile. Die letzten zwei sind keine Beobachtungen. Lies den Bericht so ein:

df = pd.read_csv(
    "report.csv",
    skiprows=3,
    comment="#",
    skipfooter=2,
    engine="python"
)

Das Ergebnis hat zwei Zeilen. Für Januar ergibt sich aus North und South eine Summe von 218. Bliebe die Summenzeile erhalten, kämen weitere 218 hinzu und es würden 436 ausgegeben. Mit den Standardeinstellungen kann stattdessen der Titel mit einem Feld zur Kopfzeile werden und zu einem Lesefehler führen, wenn Datensätze mit drei Feldern folgen.

skiprows=3 zählt die ersten drei tatsächlichen Zeilen einschließlich der Leerzeile. Eine Liste wie skiprows=[0, 2] entfernt bestimmte Zeilenpositionen, gezählt ab null. Leerzeilen werden standardmäßig übersprungen und comment="#" entfernt Kommentartext. skipfooter benötigt den Python-Parser. Passe diese Einstellungen an den tatsächlichen Aufbau an; eine feste Anzahl zu überspringender Zeilen kann falsch werden, wenn ein Exportprogramm eine Titelzeile hinzufügt.

Fehlerhafte Datensätze untersuchen

Ein Datensatz mit zu vielen Feldern kann on_bad_lines="error", die Standardeinstellung, auslösen. "warn" überspringt ihn mit einer Warnung, während "skip" ihn ohne Meldung entfernt. Untersuche den Rohdatensatz, bevor du eine der beiden Optionen wählst. Ein Komma ohne Anführungszeichen innerhalb eines Namens oder ein falsches Trennzeichen kann zusätzliche Felder erzeugen; beim Überspringen geht dann eine gültige Beobachtung verloren, statt die Ursache zu beheben.

Zu wenige Felder verhalten sich anders. Unter id,name,score wird der Datensatz 2,Ben mit einer fehlenden Punktzahl geladen. Dabei muss kein Fehler auftreten. Prüfe sowohl die Anzahl fehlender Werte als auch die Zeilenanzahl und vergleiche beim Ausschließen fehlerhafter Zeilen die behaltenen Datensätze mit der Quelle.

Mehrzeilige Kopfzeilen oder Zeichenpositionen einlesen

Zwei Zeilen mit Spaltenbezeichnungen können einen MultiIndex bilden. Mit den Gruppenbezeichnungen region,sales,sales über ,2025,2026 erzeugt header=[0, 1] Bezeichnungen wie ("sales", "2025"). Eignen sich flache Bezeichnungen besser für die Analyse, überspringe beide Kopfzeilen und gib names=["region", "sales_2025", "sales_2026"] an.

Text mit fester Feldbreite hat kein Trennzeichen. Spaltengrenzen sind Zeichenpositionen:

df = pd.read_fwf(
    "readings.txt",
    colspecs=[(0, 4), (4, 11), (11, 16)]
)

Diese halboffenen Bereiche schließen jeweils den Anfang ein und das Ende aus. Das erste Feld belegt die Positionen 0 bis 3 und das nächste beginnt bei 4. widths=[4, 7, 5] beschreibt denselben Aufbau. Bei regelmäßigen Stichproben ist die automatische Erkennung praktisch; explizite Grenzen verhindern, dass ein kurzer Wert am Anfang eine falsche Breite festlegt.

Wichtige Erkenntnisse

  • Finde Kopfzeile, Beobachtungen und Fußbereich, bevor du Optionen zum Überspringen wählst.
  • Summenzeilen, die als Beobachtungen einbezogen werden, können eine Summe verdoppeln.
  • Beim Überspringen fehlerhafter Zeilen gehen Datensätze verloren; untersuche zusätzliche Felder zuerst.
  • Kurze Datensätze können mit fehlenden Werten am Ende geladen werden.
  • Verwende bei entsprechendem Aufbau mehrzeilige Kopfzeilen oder explizite Grenzen für feste Feldbreiten.
2

Text korrekt und effizient einlesen

Ob Text korrekt erscheint, hängt von der Regel ab, mit der seine Bytes dekodiert werden. Wie effizient das Einlesen ist, hängt davon ab, was das Programm im Arbeitsspeicher behält. Du unterscheidest Kodierungsfehler von Zeichensalat, wählst anhand von Anhaltspunkten eine Zeichenkodierung und erhältst Zeichen beim Austausch. Anschließend verringerst du den Speicherbedarf großer Dateien durch Spaltenauswahl, geeignete Typen und blockweise Verarbeitung und lernst, Teilergebnisse korrekt zu kombinieren.

2.1 Wie Text als Bytes gespeichert wird

Eine Datei speichert Bytes, die jeweils einen Wert von 0 bis 255 haben. Eine Zeichenkodierung legt fest, wie Zeichen durch diese Bytes dargestellt werden. Beim Kodieren wird Python-Text in Bytes umgewandelt; beim Dekodieren werden Bytes wieder in Text umgewandelt. Dieselben Bytes können nach unterschiedlichen Dekodierungsregeln für verschiedene Zeichen stehen.

Zeichen und Bytes getrennt zählen
text = "café"
raw = text.encode("utf-8")
print(len(text))  # 4 characters
print(len(raw))   # 5 bytes
print(raw.decode("utf-8"))  # café

Der Akzent bildet hier kein zweites sichtbares Zeichen. Der Buchstabe "é" benötigt in UTF-8 zwei Bytes, sodass vier Zeichen fünf Bytes belegen. Die Anzahl der Bytes und die Anzahl der Zeichen beantworten unterschiedliche Fragen.

ASCII definiert 128 Zeichen, darunter grundlegende englische Buchstaben, Ziffern, Satzzeichen und Steuerzeichen. Ihre Bytewerte stimmen in ASCII, UTF-8, Latin-1 und Windows-1252 überein. Dieser gemeinsame Anfang erklärt, warum eine rein englische Textprobe auch bei einer falschen Kodierungseinstellung korrekt aussehen kann.

Die wichtigsten Kodierungsfamilien erkennen
ZeichenkodierungDarstellung von TextHilfreicher Hinweis
UTF-8Ein bis vier Bytes pro Unicode-ZeichenASCII-Buchstaben benötigen ein Byte; "é" benötigt zwei
Latin-1Ein Byte pro Zeichen des begrenzten ZeichenvorratsJeder Bytewert lässt sich dekodieren
Windows-1252Ein Byte pro unterstütztem ZeichenEnthält zusätzliche druckbare Symbole wie "€"
UTF-16Meist zwei Bytes pro Zeichen, für andere vierDie Bytereihenfolge ist wichtig

UTF-8 stellt jedes Unicode-Zeichen dar und ist die übliche Wahl für den Textaustausch. Latin-1 und Windows-1252 stellen einen kleineren Zeichenvorrat dar. Bei vielen Buchstaben mit Akzent stimmen sie überein, unterscheiden sich aber in einem Teil des Bytebereichs: Windows-1252 verwendet Byte 0x80 für "€", während Latin-1 dort ein Steuerzeichen hat. Die beiden Namen stehen nicht austauschbar für dieselbe Zeichenkodierung.

Byte Order Marks richtig einlesen

Eine Byte Order Mark, kurz BOM, ist eine Markierung am Anfang mancher Dateien. UTF-16 kann mit FF FE für die Little-Endian-Reihenfolge oder FE FF für die Big-Endian-Reihenfolge beginnen. encoding="utf-16" wählt die Reihenfolge anhand der BOM. Gib ohne BOM entsprechend der Quelle "utf-16-le" oder "utf-16-be" an.

Eine UTF-8-BOM ist EF BB BF. Pythons open(..., encoding="utf-8-sig") entfernt sie beim Dekodieren. Einfaches "utf-8" in open() behält sie als \ufeff, was unerwartet Teil des ersten Spaltennamens werden kann. Auch der CSV-Parser von pandas verarbeitet eine führende UTF-8-BOM, aber die Wahl von utf-8-sig macht die beabsichtigte Dateikonvention deutlich.

Die Zeichenkodierung ausdrücklich angeben
with open("notes.txt", encoding="utf-8") as f:
    text = f.read()

Die Standardeinstellung von open() hängt von der Python-Version und dem UTF-8-Modus ab. Python 3.11 bis 3.14 kann die Zeichenkodierung der Ländereinstellung verwenden; Python 3.15 aktiviert den UTF-8-Modus standardmäßig, wobei er abgeschaltet werden kann. Eine explizite Zeichenkodierung bindet das Skript auf verschiedenen Computern an das tatsächliche Format der Datei. Sie verhindert auch, dass eine Standardeinstellung der Plattform unbemerkt verändert, wie dieselben Bytes gelesen werden.

Wichtige Erkenntnisse

  • Kodieren wandelt Text in Bytes um; Dekodieren wandelt Bytes in Text um.
  • Die Anzahl der Zeichen und die Anzahl der Bytes können sich unterscheiden.
  • Textproben, die nur ASCII enthalten, können eine falsche Zeichenkodierung verbergen.
  • Latin-1 und Windows-1252 unterscheiden sich, obwohl sie viele Zeichen gemeinsam haben.
  • Nutze beim Einlesen von UTF-16 die BOM und Angaben zur Bytereihenfolge.
  • Übergib die beabsichtigte Zeichenkodierung ausdrücklich an open().

2.2 Die Ursache von Zeichensalat finden

Eine falsche Zeichenkodierung kann mit einem UnicodeDecodeError deutlich fehlschlagen oder unbemerkt scheinbar lesbaren Unsinn erzeugen, den man Zeichensalat nennt. Beide Probleme entstehen, wenn Bytes nach der falschen Regel interpretiert werden. Bewahre die Originaldatei auf, damit du sie erneut dekodieren kannst.

Einen Fehler anhand der Quelle untersuchen

Eine als Windows-1252 gespeicherte CSV-Datei enthält Städtenamen wie "Zürich" und "Málaga". Beim Einlesen als UTF-8 kann ein Fehler bei Byte 0xfc auftreten, das in Windows-1252 für "ü" verwendet wird. Sobald die Exporteinstellungen der Quelle die Zeichenkodierung bestätigen, lies die Datei so ein:

df = pd.read_csv("cities.csv", encoding="cp1252")
print(df["city"].head())

Untersuche Namen mit Akzenten oder Symbolen. Eine Textprobe, die ausschließlich aus ASCII-Zeichen besteht, kann diese Zeichenkodierungen nicht unterscheiden. Ein bestimmtes, in UTF-8 ungültiges Byte weist auf eine mögliche ältere Zeichenkodierung hin; es bestimmt nicht eindeutig, welche ältere Kodierung die Datei erzeugt hat.

Einen Fehler ohne Fehlermeldung erkennen

Werden Bytes aus UTF-8 als Windows-1252 dekodiert, kann aus "café" "café" und aus "São Paulo" "São Paulo" werden. Die Lesefunktion hat erfolgreich Zeichen erzeugt, aber die falschen. Lies die ursprünglichen Bytes erneut mit UTF-8 ein:

df = pd.read_csv("cities.csv", encoding="utf-8")

Suchen und Ersetzen repariert jeweils ein sichtbares Symptom und kann andere beschädigte Buchstaben übersehen. Außerdem besteht das Risiko, ein tatsächlich vorkommendes Zeichen zu ändern. Die korrekte Dekodierung behebt die Ursache für die ganze Datei.

Anhaltspunkte für die Zeichenkodierung sammeln

Beginne mit der Dokumentation oder den Exporteinstellungen des Anbieters. Untersuche bei Bedarf eine kleine Byteprobe:

with open("cities.csv", "rb") as f:
    sample = f.read(200)
print(sample)

Der Binärmodus erhält die Bytes, ohne sie zu dekodieren. Eine BOM kann einen direkten Hinweis geben. Ein Erkennungsprogramm wie charset-normalizer schätzt eine wahrscheinliche Zeichenkodierung, aber eine kurze Probe kann zu mehreren Möglichkeiten passen. Prüfe das Ergebnis anhand bekannter Namen mit Akzenten und Symbolen.

Latin-1 ordnet jedem Byte ein Zeichen zu und kann daher jede Bytefolge ohne Fehler dekodieren. Dieser Erfolg allein sagt nichts darüber aus, ob die Zeichen richtig sind. Auch Windows-1252 verwendet Ein-Byte-Zeichen, lässt aber einige Bytewerte undefiniert und kann einen Dekodierungsfehler auslösen.

Anhaltspunkte nicht verwerfen

encoding_errors="replace" ersetzt Bytes, die der Decoder nicht lesen kann, durch "�". encoding_errors="ignore" entfernt sie. Diese Optionen können helfen, beschädigte Eingaben zu untersuchen, sie verlieren aber Informationen und ersetzen nicht die Suche nach der richtigen Zeichenkodierung. Ein zu "Zrich" veränderter Name kann einen Abgleich genauso zum Scheitern bringen wie sichtbar entstellter Text.

Für die Ausgabe unterstützt UTF-8 den größten Zeichenumfang. Manche Tabellenkalkulationsprogramme erkennen diese Zeichenkodierung zuverlässiger, wenn eine BOM vorhanden ist:

df.to_csv("cities_export.csv", index=False, encoding="utf-8-sig")

Öffne den Export erneut im empfangenden Programm und untersuche dieselben Werte mit Akzenten. Ziel ist korrekter Text an beiden Enden des Austauschs.

Wichtige Erkenntnisse

  • Prüfe sowohl auf Dekodierungsfehler als auch auf sichtbar entstellte Zeichen.
  • Lies die ursprünglichen Bytes mit der richtigen Zeichenkodierung erneut ein, um Zeichensalat zu beheben.
  • Eine erfolgreiche Latin-1-Dekodierung beweist nicht, dass der Text korrekt ist.
  • Die Modi zum Ersetzen und Ignorieren verwerfen Zeicheninformationen.
  • Verwende UTF-8 mit einer BOM, wenn das empfangende Tabellenkalkulationsprogramm sie benötigt.

2.3 Große Dateien einlesen, ohne jede Zeile zu behalten

Die Dateigröße auf dem Datenträger entspricht nicht dem benötigten Arbeitsspeicher. pandas erstellt Arrays, Indizes und Textwerte im Arbeitsspeicher, deren Typen den Platzbedarf beeinflussen. Miss den Bedarf mit df.memory_usage(deep=True) oder df.info(memory_usage="deep"), bevor du entscheidest, wie du weitere Daten lädst.

Weniger Daten in den Arbeitsspeicher laden

Lies ausgewählte Spalten mit usecols, untersuche eine erste Stichprobe mit nrows und wähle geeignete Typen mit dtype. Eine Kategorie kann wiederholte Regionsnamen kompakt speichern. float32 benötigt weniger Platz als float64, bietet aber etwa sieben signifikante Stellen. Wähle diesen Typ daher nur, wenn diese Genauigkeit zu den Messwerten passt. Eine kleine Vorschau hilft bei der Typwahl; sie beweist nicht, dass jede spätere Zeile demselben Muster folgt.

Datenblöcke verarbeiten und ein kleines Ergebnis behalten

chunksize ändert den Rückgabewert von einem DataFrame in einen Iterator von DataFrames. Für eine Summe und einen Mittelwert:

total = 0.0
count = 0
with pd.read_csv(
    "measurements.csv",
    usecols=["amount"],
    chunksize=100_000
) as reader:
    for chunk in reader:
        total += chunk["amount"].sum()
        count += chunk["amount"].count()
mean = total / count if count else float("nan")

Die Schleife hält eine laufende Summe und die Anzahl nicht fehlender Werte fest. Jeder Datenblock kann nach der Verwendung freigegeben werden. Sammelst du alle Datenblöcke in einer Liste und fügst sie später zusammen, entsteht erneut der volle Speicherbedarf. Die blockweise Verarbeitung spart nur dann Speicher, wenn sie ein verkleinertes Ergebnis behält oder verarbeitete Teile hinausschreibt.

Eine Datei mit zehn Zeilen ergibt bei chunksize=4 Teile mit 4, 4 und 2 Zeilen. Für Beträge von 1 bis 10 und Regionen, die sich in der Reihenfolge N, S, E wiederholen, addiere die regionalen Teilsummen zu N 22, S 15 und E 18. Zusammen ergeben sie 55.

Die richtigen Größen kombinieren

Summen und Anzahlen werden addiert. Minima werden kombiniert, indem du das kleinste Teilminimum nimmst; bei Maxima nimmst du das größte Teilmaximum. Mittelwerte benötigen Gewichte, weil Datenblöcke unterschiedlich viele gültige Beobachtungen enthalten können.

Für die Werte 1, 2 und 3 in einem Datenblock und 10 in einem anderen sind die Blockmittelwerte 2 und 10. Ihr Mittelwert ist 6; dabei wird der Block mit einem Wert genauso stark gewichtet wie der Block mit drei Werten. Addiere stattdessen die Summen und Anzahlen: Die Summe 16 über vier Beobachtungen ergibt den Mittelwert 4. Die Mediane der Datenblöcke enthalten nicht genug Informationen, um den Gesamtmedian zu rekonstruieren.

Komprimierte Dateien direkt einlesen

read_csv erkennt Kompression normalerweise anhand bekannter Endungen wie .gz, .bz2, .zip, .xz und .zst. Die Datei wird beim Einlesen dekomprimiert:

with pd.read_csv("measurements.csv.gz", chunksize=100_000) as reader:
    for chunk in reader:
        print(len(chunk))

Ein so verwendetes ZIP-Archiv muss genau eine Datendatei enthalten. df.to_csv("out.csv.gz", index=False) schreibt gzip-komprimiertes CSV. Kompression verringert den Platzbedarf auf dem Datenträger und das Übertragungsvolumen; sie verringert nicht den Speicherbedarf der dekodierten Tabelle. Wenn du einen geprüften Datensatz für wiederholte Analysen in Parquet umwandelst, muss außerdem der Text nicht erneut eingelesen werden und die gespeicherten Spaltentypen werden wiederhergestellt.

Wichtige Erkenntnisse

  • Miss den Speicherbedarf einschließlich Objektinhalten und lies nur benötigte Spalten ein.
  • Blockweise Lesefunktionen liefern DataFrames; behalte verkleinerte Ergebnisse, um Speicher zu sparen.
  • Kombiniere Summen und Anzahlen nicht fehlender Werte, bevor du einen Gesamtmittelwert berechnest.
  • Die Mediane von Datenblöcken lassen sich nicht zum Gesamtmedian kombinieren.
  • Komprimierter Text wird beim Einlesen dekomprimiert; ein ZIP-Archiv benötigt eine Datendatei.
  • Parquet eignet sich für Datensätze, die wiederholt geladen werden.
3

Mit Excel-Arbeitsmappen arbeiten

Arbeitsmappen verbinden Daten mit einer für Menschen gestalteten Darstellung: mehreren Arbeitsblättern, Titeln, Formeln, verbundenen Beschriftungen und Anzeigeformaten. Du findest eine Tabelle innerhalb dieses Aufbaus und unterscheidest gespeicherte Werte von der Anzeige einer Zelle. Anschließend schreibst du Berichte mit einem oder mehreren Arbeitsblättern, steuerst Aktualisierungen einer vorhandenen Arbeitsmappe und prüfst, ob die gespeicherten Arbeitsblätter die beabsichtigten Zeilen und Werte enthalten.

3.1 Die Tabelle auf einem Arbeitsblatt finden und einlesen

Eine Excel-Arbeitsmappe kann mehrere Arbeitsblätter, Titel und berechnete Summen enthalten. Zellen haben gespeicherte Werte und Typen sowie eine Anzeigeformatierung. Beim Einlesen eines Arbeitsblatts musst du die Datentabelle finden und verstehen, welche Teile der Arbeitsmappe zu DataFrame-Werten werden.

Arbeitsblatt und Grenzen auswählen
df = pd.read_excel(
    "quarterly.xlsx",
    sheet_name="Q1",
    skiprows=2,
    usecols="A:C",
    nrows=2
)

Angenommen, Zeile 1 ist ein verbundener Titel, Zeile 2 ist leer, Zeile 3 enthält region, date und sales und die Zeilen 4 bis 5 enthalten die Beobachtungen. skiprows=2 macht Zeile 3 zur Kopfzeile; nrows=2 hält vor der Summe in Zeile 6 an. Für North 1200 und South 950 ergeben die beiden Beobachtungen zusammen 2150. Würde eine zwischengespeicherte Summe von 2150 als dritte Beobachtung einbezogen, würde sich dieser Betrag verdoppeln.

Excel zeigt Zeilennummern ab 1 an; pandas-Zeilenpositionen beginnen bei 0. Auch header=2 wählt Excel-Zeile 3 als Kopfzeile. usecols="A,C,E:F" wählt einzelne Spalten und einen Bereich aus. Die Standardeinstellung sheet_name=0 liest das erste Arbeitsblatt; ein Name wählt ein bestimmtes Arbeitsblatt und sheet_name=1 das zweite.

sheet_name=None gibt ein Dictionary zurück, das Arbeitsblattnamen DataFrames zuordnet. Wähle einen Schlüssel oder durchlaufe .items(); das Dictionary selbst ist kein einzelner DataFrame. Für mehrere Lesevorgänge aus einer Arbeitsmappe:

with pd.ExcelFile("quarterly.xlsx") as xf:
    print(xf.sheet_names)
    q1 = pd.read_excel(xf, sheet_name="Q1")
Wissen, was die Zelle tatsächlich speichert

Ein als "15%" angezeigter Prozentwert wird als 0,15 gespeichert. Eine mit fünf Ziffern angezeigte Zahl kann 2139 speichern, obwohl auf dem Bildschirm "02139" steht. Keine Leseoption kann eine Null wiederherstellen, die nur in der Formatierung existiert. Speichere Kennungen in der Arbeitsmappe als Text und übergib beim Einlesen zusätzlich dtype={"zip": str}; andernfalls kann pandas selbst aus Textzellen, die nur Ziffern enthalten, Ganzzahlen ableiten.

Die numerische Genauigkeit von Excel ist auf 15 signifikante Stellen begrenzt. Eine 16-stellige Kennung, die als Zahl eingegeben wurde, kann bereits beschädigt sein, bevor Python sie einliest. Speichere solche Werte als Text. Ein Arbeitsblatt hat höchstens 1.048.576 Zeilen und 16.384 Spalten, ein sehr großer Datensatz benötigt daher ein anderes Format.

Mit Formeln und verbundenen Zellen sorgfältig umgehen

pandas berechnet keine Formeln. Es liest die in der Arbeitsmappe zwischengespeicherten Ergebnisse. Ein Tabellenkalkulationsprogramm kann aktuelle Ergebnisse speichern; eine per Skript erzeugte Datei kann fehlende, als Platzhalter gespeicherte oder veraltete Ergebnisse enthalten. openpyxl berechnet kein Ergebnis und XlsxWriter schreibt normalerweise eine Null als Platzhalter, sofern kein Wert vorgegeben wird. Berechne wichtige Werte in pandas neu oder öffne und speichere die Arbeitsmappe in einem Tabellenkalkulationsprogramm, bevor du dich auf ihre zwischengespeicherten Summen verlässt.

Nur die Zelle oben links in einem verbundenen Zellbereich speichert die Beschriftung. Eine verbundene Länderbeschriftung kann daher in den darunterliegenden Zeilen leere Felder hinterlassen. Bestätigt der Aufbau, dass die Beschriftung für diese Zeilen gilt, überträgt df["country"] = df["country"].ffill() sie nach unten. Prüfe vor dem Auffüllen die Tabellengrenze.

Zum Einlesen wird eine Engine-Bibliothek benötigt. openpyxl verarbeitet .xlsx und .xlsm; xlrd verarbeitet .xls, pyxlsb .xlsb, odf .ods und calamine unterstützt mehrere Tabellenkalkulationsformate. Eine fehlende Engine löst einen ImportError aus, der die benötigte Bibliothek nennt. Farben, Kommentare und andere Gestaltungselemente werden nicht als DataFrame-Daten geladen.

Wichtige Erkenntnisse

  • Wähle Arbeitsblatt, Kopfzeile, Spalten und Beobachtungszeilen ausdrücklich aus.
  • sheet_name=None gibt ein Dictionary von DataFrames zurück.
  • Gespeicherte Werte können von angezeigten Prozentwerten oder mit Nullen aufgefüllten Kennungen abweichen.
  • pandas berechnet keine Formeln; ihre zwischengespeicherten Ergebnisse können veraltet sein oder fehlen.
  • Verbundene Beschriftungen stehen in der Zelle oben links.
  • Speichere lange Kennungen als Text, bevor Excel sie runden kann.
  • Installiere eine Lese-Engine, die mit dem Format der Arbeitsmappe kompatibel ist.

3.2 Eine Arbeitsmappe mit mehreren Arbeitsblättern schreiben

Excel ist nützlich, wenn Personen einen Bericht in einem Tabellenkalkulationsprogramm öffnen und untersuchen sollen. Ein DataFrame kann zu einem Arbeitsblatt werden oder mehrere DataFrames können sich eine Arbeitsmappe teilen. Wähle vor dem Schreiben Zielpfad und Arbeitsblattnamen, damit jede Tabelle an der vorgesehenen Stelle landet.

Eine oder mehrere Tabellen schreiben
weather.to_excel(
    "weather.xlsx",
    sheet_name="Weather",
    index=False
)

index=False hält die standardmäßigen Zeilennummern aus dem Arbeitsblatt heraus. Ohne diese Einstellung erscheinen sie als zusätzliche erste Spalte und können bei einem späteren Einlesen als "Unnamed: 0" zurückkommen. Behalte einen Index nur, wenn er aussagekräftige Bezeichnungen enthält, die in den Bericht gehören.

Ein to_excel-Aufruf mit Pfad schreibt eine Arbeitsmappe an diesen Pfad und ersetzt eine vorhandene Datei. Rufst du die Methode am selben Pfad einmal für Weather und erneut für Counts auf, bleibt möglicherweise nur die zweite Tabelle erhalten. Verwende für beide einen einzigen Writer:

with pd.ExcelWriter("report.xlsx") as writer:
    weather.to_excel(writer, sheet_name="Weather", index=False)
    counts.to_excel(writer, sheet_name="Counts", index=False)

Der Kontextmanager schließt und vervollständigt die Arbeitsmappe am Ende des Blocks. Das Einlesen mit pd.read_excel("report.xlsx", sheet_name=None) liefert ein Dictionary mit beiden Arbeitsblattnamen. Zum Schreiben von .xlsx wird openpyxl oder XlsxWriter benötigt.

Ein Arbeitsblatt in einer vorhandenen Arbeitsmappe aktualisieren

Um ein Arbeitsblatt zu ersetzen und die anderen zu erhalten, verwende einen Writer im Anfügemodus:

with pd.ExcelWriter(
    "report.xlsx",
    mode="a",
    engine="openpyxl",
    if_sheet_exists="replace"
) as writer:
    counts.to_excel(writer, sheet_name="Counts", index=False)

if_sheet_exists steuert eine Namenskollision. "error" bricht ab, "new" erstellt ein weiteres Arbeitsblatt, "replace" ersetzt das betreffende Arbeitsblatt und "overlay" schreibt in dessen vorhandene Zellen. Beim überlagernden Schreiben werden alte Zellen außerhalb der neuen Tabelle nicht geleert, sodass bei einer kürzeren Aktualisierung alte Zeilen zurückbleiben können. Entscheide, ob der Bericht ein vollständiges Ersetzen des Arbeitsblatts oder ein sorgfältig positioniertes überlagerndes Schreiben benötigt.

Die Ausgabe leicht wieder öffnen können

Arbeitsblattnamen sind auf 31 Zeichen begrenzt und dürfen :, \, /, ?, *, [ oder ] nicht enthalten. Ein kurzer Name wie "Q1 Summary" funktioniert; "Q1/Q2" enthält einen verbotenen Schrägstrich. Manche Engines warnen bei einem zu langen Namen, statt abzubrechen. Wähle daher selbst kompatible Namen.

startrow und startcol positionieren eine Tabelle anhand von Offsets, die bei null beginnen. na_rep gibt fehlenden Werten ein sichtbares Kennzeichen. float_format="%.2f" rundet geschriebene Zahlen und autofilter=True ergänzt in pandas 3 Filterschaltflächen in der Kopfzeile. Datums- und Zeitspalten werden als Excel-Datumswerte geschrieben.

Runden bei der Ausgabe verändert die gespeicherten Zahlen, nicht nur ihre Anzeige. Bewahre eine Analysedatei mit voller Genauigkeit separat auf, wenn ein gerundeter Bericht benötigt wird. Öffne die Arbeitsmappe erneut und prüfe die Liste der Arbeitsblätter, die Tabellenmaße und repräsentative Werte. Das Einlesen von Excel ist relativ langsam und ein Roundtrip kann pandas-Datentypen verändern. Verwende daher Parquet für zwischengespeicherte Analysetabellen, wenn der Erhalt der Typen wichtig ist.

Wichtige Erkenntnisse

  • Verwende einen einzigen ExcelWriter, um mehrere Tabellen in einer neuen Arbeitsmappe abzulegen.
  • Ein Schreibvorgang mit Pfad ersetzt eine vorhandene Arbeitsmappe.
  • Anfügemodus und if_sheet_exists steuern Aktualisierungen vorhandener Arbeitsblätter.
  • Wähle gültige Arbeitsblattnamen und prüfe die erneut geöffnete Arbeitsmappe.
4

Daten aus JSON-Dateien und Web-APIs abrufen

JSON und Web-APIs liefern Datensätze in Formen, die nicht immer zu einer Tabelle passen. Du liest und schreibst JSON, wählst einen passenden Tabellenaufbau und wandelst verschachtelte Objekte oder Listen in eine flache Tabelle um. Dabei behältst du im Blick, was jede Zeile darstellt. Außerdem prüfst du HTTP-Antworten, rufst weitere Seiten ab und gehst mit Zugangsdaten und Anfrageratenbegrenzungen um, damit der entstehende Datensatz die beabsichtigten Datensätze enthält.

4.1 JSON-Objekte, Tabellen und zeilenweise Datensätze

JSON speichert verschachtelte Daten als Text. Objekte enthalten Name-Wert-Paare, Arrays enthalten geordnete Werte und Zeichenketten stehen in doppelten Anführungszeichen. Weitere Werte sind Zahlen, true, false und null. Pythons Modul json wandelt diese Syntax in Python-Objekte um, bevor du eine Tabelle erstellst.

Gültiges JSON einlesen und schreiben
import json

text = '{"station":"Oslo","active":true,"temp_c":[3.5,null,4.0]}'
data = json.loads(text)
print(data["active"])   # True
print(data["temp_c"])   # [3.5, None, 4.0]

Objekte werden zu Dictionaries, Arrays zu Listen und null zu None. json.loads liest eine Zeichenkette ein; json.load liest eine geöffnete Datei. Die Schreibfunktionen kehren die Richtung um: json.dumps gibt Text zurück und json.dump schreibt in eine Datei.

with open("station.json", "w", encoding="utf-8") as f:
    json.dump(data, f, ensure_ascii=False, indent=2)

ensure_ascii=False lässt Zeichen wie "ü" lesbar. Die Standardeinstellung kann dasselbe Zeichen als \u00fc schreiben; beide Formen stehen für dieselbe Zeichenkette. Ein ausgegebenes Python-Dictionary ist kein JSON: Einfache Anführungszeichen, True, None und abschließende Kommas sind ungültige JSON-Syntax. Standard-JSON kennt auch kein NaN. Pythons Encoder erlaubt es standardmäßig, aber allow_nan=False lehnt es ab; pandas schreibt fehlende Werte als null.

Den Tabellenaufbau berücksichtigen

Eine JSON-Tabelle benötigt eine Ausrichtung (Orientation), also eine Anordnung von Zeilen, Bezeichnungen und Werten. orient="records" ergibt ein Objekt pro Zeile:

[{"city":"Lyon","temp_c":21.5},{"city":"Osaka","temp_c":null}]

Die standardmäßige DataFrame-Ausrichtung "columns" gruppiert Werte unter Spaltennamen und anschließend unter Zeilenbezeichnungen. "split" speichert Spalten, Index und Daten getrennt. Gib eine Ausrichtung an, die zum empfangenden Programm passt, statt anzunehmen, dass jede JSON-Tabelle dieselbe Form hat.

from io import StringIO
import pandas as pd

df = pd.read_json(
    StringIO('[{"code":"0042","amount":9.5}]'),
    orient="records",
    dtype={"code": str}
)

In pandas 3 ist eine einfache Zeichenkette, die an read_json übergeben wird, ein Pfad. Verpacke daher tatsächlichen JSON-Text in StringIO. Selbst JSON-Zeichenketten, die nur Ziffern enthalten, können als Zahlen erkannt werden; der explizite Datentyp erhält "0042".

JSON Lines für aufeinanderfolgende Datensätze verwenden

JSON Lines enthält ein vollständiges JSON-Objekt pro Zeile, ohne umschließendes Array oder Kommas zwischen den Datensätzen:

{"id":1,"amount":9.5}
{"id":2,"amount":12.0}

Lies das Format mit pd.read_json(path, lines=True) und schreibe es mit df.to_json(path, orient="records", lines=True). Die Leseoptionen chunksize und nrows benötigen lines=True, wodurch einzelne Datensätze nacheinander verfügbar werden.

Setze beim Export von Datumsangaben date_format="iso" für lesbare ISO-Zeitstempel. pandas 3.1 verwendet für die gewöhnliche JSON-Ausgabe von DataFrames weiterhin standardmäßig Millisekunden seit der Epoche, aber diese Standardeinstellung ändert sich. Eine explizite Datumsausgabe verhindert, dass die Lesefunktion erraten muss, wofür eine große Ganzzahl steht.

Wichtige Erkenntnisse

  • Die JSON-Syntax unterscheidet sich von einem ausgegebenen Python-Dictionary.
  • load und dump verwenden Dateien; loads und dumps verwenden Zeichenketten.
  • Wähle eine Ausrichtung, die zum Tabellenaufbau passt.
  • Verpacke JSON-Text für read_json in StringIO und erhalte die Typen von Kennungen.
  • JSON Lines verwendet ein Objekt pro Zeile und unterstützt blockweises Einlesen.
  • Verwende die ISO-Datumsausgabe für lesbare Zeitstempel beim Austausch.

4.2 Festlegen, was eine Zeile verschachtelter Daten darstellt

Verschachteltes JSON kann eine Bestellung, ihren Kunden und mehrere Artikel in einem Objekt beschreiben. Lege vor der Umwandlung in eine flache Tabelle die Zeilengranularität fest: was eine Zeile darstellt. Sie bestimmt, welche Beträge summiert werden können.

Zuerst verschachtelte Objekte in Spalten umwandeln

Betrachte zwei Bestellungen. Bestellung 501 gehört Ana und enthält die Artikel A1 (Menge 2, Preis 3,5) und B7 (Menge 1, Preis 10,0). Bestellung 502 gehört Ben und enthält A1 (Menge 4, Preis 3,5). Die Kundendaten sind verschachtelte Objekte und die Artikel sind Listen.

orders = [
    {"order_id": 501,
     "customer": {"name": "Ana", "country": "PT"},
     "items": [{"sku": "A1", "qty": 2, "price": 3.5},
               {"sku": "B7", "qty": 1, "price": 10.0}]},
    {"order_id": 502,
     "customer": {"name": "Ben", "country": "CA"},
     "items": [{"sku": "A1", "qty": 4, "price": 3.5}]}
]
order_rows = pd.json_normalize(orders)

Dies erzeugt zwei Zeilen und vier Spalten: order_id, items, customer.name und customer.country. Die verschachtelten Kundenfelder werden zu Spalten mit Punkten in den Namen. Die Artikellisten bleiben in Zellen; die Normalisierung wandelt nicht automatisch jede Liste in Zeilen um.

Eine Liste mit übergeordneten Informationen erweitern
items = pd.json_normalize(
    orders,
    record_path="items",
    meta=["order_id", ["customer", "name"]]
)

record_path wählt die Liste, deren Einträge zu Zeilen werden. meta kopiert übergeordnete Werte in jede Zeile; für einen verschachtelten Pfad wird eine Liste von Schlüsseln angegeben. Das Ergebnis hat drei Artikelzeilen: zwei für Anas Bestellung und eine für Bens Bestellung. Der Umsatz ergibt sich aus Menge mal Preis: 7,0, 10,0 und 14,0, zusammen 31,0.

Betragen die Versandkosten auf Bestellungsebene 4,00, werden sie in beiden Artikelzeilen für Bestellung 501 wiederholt. Die Summe dieser wiederholten Kosten ergibt 8,00 für eine Bestellung. Bewahre Beträge auf Bestellungsebene in einer separaten Bestelltabelle auf, wenn du auch eine Artikeltabelle benötigst; behalte order_id, um sie zu verbinden.

Namen und fehlende Felder steuern

sep="_" erzeugt Namen wie customer_name. record_prefix="item_" unterscheidet Artikelfelder von gleichnamigen übergeordneten Feldern. max_level=0 lässt verschachtelte Dictionaries unverändert.

Ein gewöhnliches verschachteltes Feld, das in einem Datensatz fehlt, wird in seiner Ausgabespalte zu einem fehlenden Wert. Ein über meta angefordertes fehlendes Feld löst standardmäßig KeyError aus; errors="ignore" erlaubt fehlende Metadaten und füllt sie mit NaN. Eine fehlende, in record_path benannte Liste muss weiterhin korrigiert werden.

API-Antworten vor dem Umformen auspacken

Eine API kann ein Hüllobjekt mit count, next und results zurückgeben. Übergib data["results"] an pd.json_normalize, um die Datensätze in eine flache Tabelle umzuwandeln. Wird das Hüllobjekt selbst übergeben, wird ein einzelnes umschließendes Objekt normalisiert und seine Ergebnisliste bleibt in einer Zelle. Halte die Paginierungsmetadaten für den Abruf späterer Seiten verfügbar, erstelle die Analysetabelle aber aus der eigentlichen Datensatzliste.

Wichtige Erkenntnisse

  • Entscheide, ob jede Zeile ein übergeordnetes Objekt oder einen Listeneintrag darstellt.
  • json_normalize erweitert verschachtelte Objekte; record_path erweitert eine ausgewählte Liste.
  • meta wiederholt übergeordnete Felder in jeder untergeordneten Zeile.
  • Beträge auf übergeordneter Ebene können nach dem Erweitern einer Liste doppelt gezählt werden.
  • Wandle die Datensätze innerhalb eines API-Hüllobjekts in eine flache Tabelle um, nicht das Hüllobjekt.

4.3 Ein vollständiges, geprüftes API-Ergebnis anfordern

Eine Web-API nimmt eine HTTP-Anfrage an einem Endpunkt entgegen und gibt einen Statuscode, Header und einen Antwortinhalt zurück. Viele APIs verwenden JSON als Antwortinhalt, aber eine erfolgreich eingegangene Antwort bedeutet nicht, dass sie die benötigten Daten oder alle benötigten Datensätze enthält.

Parameter senden und die Antwort prüfen
import requests

resp = requests.get(
    url,
    params={"city": "Lima", "units": "metric"},
    timeout=10
)
resp.raise_for_status()
data = resp.json()
df = pd.json_normalize(data["results"])

Hier ist url der dokumentierte Endpunkt der API. params kodiert die Abfragezeichenkette, sodass Leerzeichen und Sonderzeichen in Werten korrekt verarbeitet werden. Requests hat standardmäßig kein Zeitlimit. Ein einzelner Zeitlimitwert steuert die Wartezeit beim Verbinden und Lesen; er ist keine Frist für das Herunterladen der gesamten Antwort.

Rufe raise_for_status() auf, bevor du den Antwortinhalt verwendest. Die Methode löst bei 4xx- und 5xx-Antworten einen HTTP-Fehler aus. Eine JSON-Fehlermeldung kann erfolgreich eingelesen werden und trotzdem eine fehlgeschlagene Anfrage beschreiben; umgekehrt kann eine 200-Antwort Text enthalten, der kein JSON ist, sodass resp.json() fehlschlägt. Untersuche resp.text, wenn das Antwortformat unerwartet ist.

StatusBedeutung für die Untersuchung
200Anfrage erfolgreich
400Angaben der Anfrage sind ungültig
401Zugangsdaten fehlen oder sind ungültig
403Zugriff ist verboten
404Angeforderte Ressource wurde nicht gefunden
429Anfragerate ist zu hoch
5xxServerseitiger Fehler
Zugangsdaten getrennt halten

Verwende die von der API dokumentierte Authentifizierungsmethode. Für ein Bearer-Token lies einen Schlüssel aus einer Umgebungsvariablen und sende ihn in einem Header:

import os

key = os.environ["WEATHER_API_KEY"]
headers = {"Authorization": "Bearer " + key}

Halte Schlüssel aus gespeichertem Code und Notebooks heraus. Wurde ein Schlüssel weitergegeben oder eingecheckt, widerrufe und ersetze ihn. Ein Schlüssel gewährt Zugriff; einen angezeigten Wert später zu verbergen, macht seine Offenlegung nicht rückgängig.

Fortfahren, bis alle Seiten eingelesen sind

Folge dem dokumentierten Verfahren der API für die nächste Seite, unabhängig davon, ob es Seitennummern, Offsets oder eine URL für die nächste Seite verwendet. Sammle die Datensätze jeder Seite und halte bei der angegebenen Endbedingung an. Insgesamt 230 Datensätze mit 100 pro Seite erfordern Seiten mit 100, 100 und 30 Datensätzen. Die erste Seite kann völlig gültig sein, während der Datensatz unvollständig ist.

Vergleiche die gesammelte Anzahl mit einer gemeldeten Gesamtzahl, sofern verfügbar. Beachte Anfrageratenbegrenzungen: 429 bedeutet, vor einer weiteren Anfrage zu warten, und Retry-After kann die Wartezeit angeben. Dieser Header kann Sekunden oder ein HTTP-Datum enthalten. Speichere Rohantworten für eine reproduzierbare Analyse und um zu vermeiden, dieselben Daten bei jeder erneuten Ausführung herunterzuladen.

Andere Webformate für Tabellen erkennen

pd.read_html(url) gibt eine Liste von DataFrames zurück, einen für jede passende HTML-Tabelle. match="Population" beschränkt die Tabellen anhand ihres Textes. Die Funktion benötigt eine Bibliothek zum Einlesen von HTML wie lxml oder BeautifulSoup mit html5lib. pd.read_xml liest wiederholte XML-Elemente als Zeilen ein und verwendet lxml oder parser="etree". Prüfe vor dem automatisierten Auslesen einer Website deren Bedingungen und bevorzuge einen offiziellen Download oder eine API, sofern verfügbar.

Wichtige Erkenntnisse

  • Sende Abfragewerte mit params und lege ein explizites Zeitlimit fest.
  • Prüfe den HTTP-Status, bevor du den erwarteten Antwortinhalt einliest.
  • Bewahre Schlüssel in Umgebungsvariablen auf und ersetze offengelegte Schlüssel.
  • Folge der Paginierung bis zum Ende und prüfe die Anzahl der gesammelten Datensätze.
  • Beachte Anfrageratenbegrenzungen und speichere Rohantworten für die Reproduzierbarkeit.
  • read_html gibt eine Liste von Tabellen zurück; für XML gibt es eine eigene Lesefunktion.
5

Daten im passenden Dateiformat speichern

Beim Speichern einer Tabelle entscheidest du, wie sie als Nächstes verwendet werden soll. Eine andere Person benötigt möglicherweise eine lesbare CSV-Datei oder Arbeitsmappe, während deine nächste Analyse exakte Typen und volle Genauigkeit benötigt. Du steuerst die CSV-Ausgabe, vergleichst gängige Austausch- und Binärformate und verwendest Parquet für Tabellen mit festgelegten Datentypen. Außerdem wählst du beim Einlesen Spalten und Partitionen aus und hältst Dateien eines Datenbestands beim Hinzufügen weiterer Daten konsistent.

5.1 CSV ohne versehentlich hinzugefügte Daten schreiben

Ein CSV-Export sollte die Werte erhalten, die der Empfänger benötigt, und seine Konventionen deutlich machen. Entscheide, ob der Zeilenindex Daten enthält, wie fehlende Werte erscheinen und ob die Ausgabe für eine präzise Analyse oder eine gerundete Anzeige bestimmt ist.

Entscheiden, was zu einer Spalte wird
df.to_csv("weather_processed.csv", index=False)

Standardmäßig wird der Index geschrieben. Bei einer Tabelle mit einem gewöhnlichen nummerierten Index fügt dies ein unbenanntes erstes Feld hinzu; ein späteres read_csv kann es als "Unnamed: 0" anzeigen. index=False lässt diese Zeilennummern weg. Enthält der Index aussagekräftige Bezeichnungen, behalte ihn und lies ihn mit index_col=0 wieder ein.

Fehlende Werte werden normalerweise zu leeren Feldern. na_rep="NA" macht sie sichtbar, aber die empfangende Lesefunktion muss dieses Kennzeichen korrekt interpretieren. In einer Städtetabelle mit Lyon bei 21,5 °C und Osaka bei 18,25 °C sollte ein fehlender Niederschlagswert für Osaka von null Niederschlag unterscheidbar bleiben.

Die Textkonvention des Empfängers berücksichtigen
df.to_csv(
    "weather_export.csv",
    index=False,
    sep=";",
    decimal=",",
    na_rep="NA",
    date_format="%Y-%m-%d",
    encoding="utf-8"
)

Die Optionen für Trennzeichen und Dezimaltrennzeichen erzeugen Werte wie Lyon;21,5;0,0. Die ISO-Datumsausgabe hält Tag und Monat eindeutig. Verwende encoding="utf-8-sig", wenn ein empfangendes Tabellenkalkulationsprogramm eine BOM benötigt, um UTF-8 zu erkennen.

float_format="%.1f" schreibt eine Nachkommastelle. Der Wert 18,25 wird bei dieser Formatierung zu "18.2" und die verworfene Genauigkeit lässt sich aus der CSV-Datei nicht wiederherstellen. Bewahre Analysedaten mit voller Genauigkeit auf; erstelle bei Bedarf einen separaten gerundeten Bericht.

Prüfen, was einen Roundtrip übersteht

CSV speichert Zeichen ohne pandas-Datentypmetadaten. Betrachte vier Spalten: eine Kennung "02139", einen Datums- und Zeitwert, eine geordnete Kategorie A < B < C und Ganzzahlen mit Fehlwertunterstützung und einer Lücke. Ein standardmäßiges Einlesen der CSV-Datei kann die Ganzzahl 2139, Datumstext, einfache Kategoriebezeichnungen ohne ihre Reihenfolge und Gleitkommazahlen für die Anzahlen zurückgeben.

Ein erfolgreich abgeschlossener Lesevorgang hat den ursprünglichen DataFrame daher nicht unbedingt wiederhergestellt. Bewahre die Optionen auf, die zum Rekonstruieren der Daten benötigt werden, einschließlich Textkennungen, Einlesen von Datumsangaben und Fehlwertkennzeichen. Auch die Reihenfolge der Kategorien muss erneut festgelegt werden. Für wiederholte Analysen, bei denen diese Typen wichtig sind, kann Parquet sie direkt erhalten.

Datensätze anfügen und Roheingaben schützen
df.to_csv(
    "daily_results.csv",
    mode="a",
    header=False,
    index=False
)

Dies fügt Zeilen an eine vorhandene Datei an. Halte Spaltenreihenfolge und Konventionen mit dieser Datei konsistent. Mit header=True schreibt ein Anfügevorgang eine weitere Kopfzeile in die Mitte und beim nächsten Einlesen kann sie als Datensatz behandelt werden. Schreibe bei einer neuen Datei die Kopfzeile einmal, bevor du später Zeilen anfügst.

Bewahre erhaltene oder heruntergeladene Dateien unverändert an einem Rohdaten-Speicherort auf. Schreibe abgeleitete Ergebnisse separat unter aussagekräftigen Namen. Prüfe nach dem erneuten Öffnen eines verarbeiteten Exports dessen Zeilenanzahl, Spalten, fehlende Werte und repräsentative Werte einschließlich führender Nullen und Datumsangaben.

Wichtige Erkenntnisse

  • Lass einen standardmäßigen Zeilenindex mit index=False weg.
  • Wähle Fehlwertkennzeichen, Zeichenkodierung und Zahlenschreibweisen passend zum Empfänger.
  • Runden bei der Ausgabe entfernt dauerhaft Genauigkeit.
  • CSV-Roundtrips benötigen explizite Leseoptionen, um Typen wiederherzustellen.
  • Füge ohne wiederholte Kopfzeilen an und lass Rohdateien unverändert.

5.2 Ein Format für die nächste Verwendung wählen

Das beste Speicherformat hängt davon ab, wer die Daten als Nächstes liest und was beim Austausch erhalten bleiben muss. Eine an eine andere Person gesendete Tabelle, eine verschachtelte API-Antwort und ein Analysedatensatz mit festgelegten Typen haben unterschiedliche Anforderungen.

Textbasierte und binäre Speicherung vergleichen

Textformate kodieren sichtbare Zeichen. CSV lässt sich leicht untersuchen und wird breit unterstützt; JSON stellt verschachtelte Objekte und Arrays auf natürliche Weise dar. CSV hat kein Spaltentypschema und gewöhnliche JSON-Wertetypen erhalten nicht jeden pandas-Datentyp. Beim erneuten Einlesen müssen sie interpretiert und gegebenenfalls Typen ausdrücklich ausgewählt werden.

Binärformate kodieren Daten so, dass Software sie direkt lesen kann. Formate wie Parquet und Feather speichern ein Schema, das Spalten und Typen beschreibt. Dadurch müssen Typen seltener erneut ermittelt werden. Die Typunterstützung hängt weiterhin vom Format und der Lesefunktion ab: Beliebige Python-Objekte werden nicht allein dadurch portabel, dass die Datei binär ist.

Ein zeilenorientierter Aufbau hält die Felder eines Datensatzes zusammen. Ein spaltenorientierter Aufbau hält Werte derselben Spalte zusammen. Für Analysen werden häufig einige Spalten aus vielen Zeilen benötigt, sodass spaltenorientierte Lesefunktionen nicht benötigte Spalten überspringen können. Ähnliche benachbarte Werte lassen sich außerdem gut komprimieren. Dateigröße und Geschwindigkeit hängen von den Daten ab; ein Kompressionsergebnis für eine Tabelle ist kein festes Verhältnis für alle Tabellen.

Jedem Format eine Aufgabe zuordnen
FormatEine geeignete AufgabeWesentlicher Gesichtspunkt
CSVEinfacher TabellenaustauschTypen beim Einlesen rekonstruieren
ExcelBerichte für TabellenkalkulationenAufbau und Grenzen der Tabellenkalkulation sind wichtig
JSONVerschachtelte Datensätze und WebdiensteObjekt- und Tabellenaufbau wählen
ParquetGespeicherte AnalysedatensätzeTypisiert, spaltenorientiert, komprimiert und breit unterstützt
FeatherSchneller DataFrame-AustauschArrow-basierte Speicherung für kompatible Werkzeuge
pickleEigene temporäre Python-ObjekteVertrauen und Versionskompatibilität sind wichtig
HDF5Mehrere große wissenschaftliche DatensätzeHierarchische Organisation; PyTables für pandas
DatenbankGemeinsame Abfragen und AktualisierungenVerbindungen, Berechtigungen und Transaktionen

Parquet ist ein offenes Format, das von pandas, R, Spark und DuckDB verwendet wird. Feather nutzt Arrow IPC und eignet sich für den schnellen Austausch zwischen Python und R oder zwischen lokalen Schritten. to_feather und read_feather ermöglichen diesen Austausch. HDF5 gruppiert mehrere Datensätze in einer Datei; to_hdf von pandas benötigt PyTables.

Die Vertrauensgrenze von pickle verstehen

pickle kann Python-Objekte über gewöhnliche Tabellen hinaus speichern, aber beim Laden kann Code ausgeführt werden. Lade nie eine pickle-Datei aus einer nicht vertrauenswürdigen Quelle. Verwende das Format für eigene kurzlebige Objekte und rechne mit Kompatibilitätsgrenzen, wenn sich Python und Bibliotheken ändern. Beispielsweise unterstützt pandas 3 das Einlesen von pickle-Dateien nicht mehr, die mit pandas-Versionen vor 1.0 erstellt wurden.

Nach dem benötigten Ergebnis entscheiden

Muss ein Empfänger eine kleine Tabelle ohne besondere Werkzeuge untersuchen, ist CSV praktisch. Benötigt er benannte Arbeitsblätter, verwende Excel. Möchtest du Kennungen, Kategorien und Typen mit Fehlwertunterstützung zwischen Analysesitzungen erhalten, wähle Parquet. Müssen mehrere Programme gemeinsam genutzte Datensätze abfragen und aktualisieren, eignet sich eine Datenbank besser, als Kopien einer Datei weiterzugeben. Die Formatwahl richtet sich nach der nächsten Verwendung, nicht nach der Endung der ursprünglichen Eingabe.

Wichtige Erkenntnisse

  • Wähle ein Format nach Empfänger, Datenstruktur und dem erforderlichen Erhalt der Typen.
  • Spaltenorientierte Formate unterstützen das Einlesen ausgewählter Spalten und eine nützliche Kompression.
  • Parquet eignet sich für gespeicherte Analysetabellen; Excel eignet sich für Berichte in Tabellenkalkulationen.
  • Feather unterstützt schnellen Austausch; HDF5 gruppiert wissenschaftliche Datensätze.
  • pickle-Dateien aus nicht vertrauenswürdigen Quellen können beim Laden Code ausführen.
  • Datenbanken unterstützen gemeinsame Abfragen und Aktualisierungen.

5.3 Tabellen mit ihren Datentypen in Parquet speichern

Parquet speichert eine Tabelle mit ihren Spaltentypen in einem offenen, spaltenorientierten Format. Das ist nützlich, wenn ein geprüfter DataFrame wiederholt geladen oder an andere Analysewerkzeuge übergeben wird. pandas verwendet für die folgenden Beispiele PyArrow.

Einen Roundtrip mit Datentypen schreiben und prüfen
df.to_parquet("sales.parquet", engine="pyarrow")
restored = pd.read_parquet("sales.parquet", engine="pyarrow")
print(restored.dtypes)

Eine Textkennung "02139", eine Datums- und Zeitspalte, eine geordnete Kategorie und Ganzzahlen mit Fehlwertunterstützung können diesen Roundtrip von pandas über PyArrow zu pandas mit ihren Typen überstehen. Anders als beim Einlesen von CSV muss dabei weder die Rolle der Kennung erraten noch die Kategorienreihenfolge neu erstellt werden. Untersuche Typen und repräsentative Werte, wenn du eine neue Schreib- oder Lesefunktion einführst.

Die Standardeinstellung index=None speichert einen RangeIndex kompakt als Metadatum. Ein anderer Index wird als Spalten geschrieben und beim Einlesen wiederhergestellt. Verwende index=False, wenn der Index nicht benötigt wird. Diese Entscheidung betrifft Zeilenbezeichnungen unabhängig von den gewöhnlichen Tabellenspalten.

Weniger einlesen und Kompression wählen
small = pd.read_parquet(
    "sales.parquet",
    columns=["zip", "amount"]
)

Die Lesefunktion kann nur diese Spalten aus dem Speicher abrufen. Das unterscheidet sich davon, die ganze Tabelle zu laden und anschließend auszuwählen: Dabei ist bereits der Aufwand für das vollständige Einlesen angefallen. Die Spaltenauswahl ist besonders für breite Tabellen nützlich.

Snappy ist der standardmäßige Kompressionscodec. compression="zstd" oder "gzip" ergibt häufig kleinere Dateien bei höherem Schreibaufwand, während compression=None unkomprimierte Daten schreibt. Miss den Kompromiss mit repräsentativen Daten; wiederholte Bezeichnungen und zufällige Messwerte lassen sich unterschiedlich komprimieren. Installiere PyArrow; die alternative Engine fastparquet gilt in pandas 3.1 als veraltet.

Einen Datenbestand in Partitionen organisieren
df.to_parquet(
    "sales_dataset",
    engine="pyarrow",
    partition_cols=["year"],
    index=False
)
recent = pd.read_parquet(
    "sales_dataset",
    filters=[("year", "==", 2026)]
)

Das Ziel ist ein Verzeichnis mit Unterverzeichnissen wie year=2025 und year=2026. Das Einlesen des Verzeichnisses lädt den Datenbestand; ein Filter kann nicht benötigte Partitionen auslassen. Bei diesem Aufbau leitet PyArrow die Werte von year aus Verzeichnisnamen ab und pandas erhält üblicherweise eine kategoriale Partitionsspalte.

Wähle eine Partitionsspalte mit einer kleinen Anzahl nützlicher Werte, nach denen du häufig filterst. Eine eindeutige Datensatzkennung erzeugt Tausende winzige Partitionen und erhöht den Aufwand für Dateien und Verzeichnisse. Ein Jahr oder eine kleine Auswahl an Regionen bietet häufig eine praktischere Aufteilung.

Daten hinzufügen, ohne den Datenbestand zu beschädigen

Eine einzelne Parquet-Datei unterstützt über pandas kein Anfügen von Zeilen wie eine CSV-Datei. Schreibe neue Dateien oder Partitionen in das Verzeichnis des Datenbestands oder lies eine einzelne Datei, kombiniere die Daten und schreibe sie erneut. Dateien desselben Datenbestands benötigen kompatible Schemata. Speichert eine Datei einen Code als Text und eine andere als Ganzzahl, kann das Laden fehlschlagen oder Werte umwandeln. Lege vor dem Schreiben jedes Teils einheitliche Datentypen fest und prüfe, dass eine hinzugefügte Partition keine überlappenden Kopien derselben Datensätze erzeugt.

Wichtige Erkenntnisse

  • Parquet erhält unterstützte Spaltentypen bei Verwendung kompatibler Lesefunktionen.
  • columns liest nur benötigte Spalten; filters beschränkt die Daten auf passende Werte.
  • Die Speicherung des Index wird unabhängig von gewöhnlichen Spalten gesteuert.
  • Partitioniere nach einigen wenigen Werten, nach denen häufig gefiltert wird, und vermeide winzige Dateien.
  • Füge Dateien mit kompatiblen Schemata zum Datenbestand hinzu; hänge keine Bytes an eine einzelne Datei an.
6

Daten aus SQL-Datenbanken lesen und in SQL-Datenbanken schreiben

Bei der Arbeit mit Datenbanken triffst du zwei Entscheidungen: welches Ergebnis du anforderst und welche Änderung du speicherst. Du öffnest und schließt Verbindungen, liest vorgegebene SQL-Abfragen in pandas ein und bindest veränderliche Werte, ohne die Abfragestruktur zu verändern. Anschließend steuerst du Ergebnistypen und blockweise Verarbeitung, wählst einen Schreibmodus für Tabellen und prüfst seine Wirkung, einschließlich des Unterschieds zwischen einem vollständigen Laden und einem wiederholten Anfügen.

6.1 Eine Datenbankverbindung öffnen und ein Ergebnis einlesen

Eine relationale Datenbank speichert Datensätze in Tabellen mit benannten Spalten. Ein Programm sendet eine SQL-Abfrage über eine Verbindung und erhält ein Ergebnis, das pandas in einen DataFrame umwandeln kann. Die Datenbank kann nur die benötigten Daten auswählen, bevor sie an Python übertragen werden.

Mit einer SQLite-Datei beginnen
import sqlite3
import pandas as pd

con = sqlite3.connect("shop.db")
try:
    df = pd.read_sql_query(
        "SELECT region, amount FROM sales", con
    )
finally:
    con.close()

SQLite läuft ohne separaten Server und speichert eine Datenbank in einer Datei. Beim Verbinden wird die Datei erstellt, falls sie nicht existiert. Ein falsch eingegebener Pfad kann daher eine neue, leere Datenbank statt der gewünschten öffnen. ":memory:" erstellt eine temporäre Datenbank im Arbeitsspeicher. Die obige Abfrage gibt die Spalten region und amount aus einer vorhandenen Tabelle sales zurück; die Spaltennamen des Ergebnisses werden zu DataFrame-Bezeichnungen.

Der with-Block einer SQLite-Verbindung verwaltet eine Transaktion, schließt aber die Verbindung nicht. Rufe nach Abschluss ausdrücklich close() auf. Ein try/finally-Block schließt die Verbindung auch dann, wenn beim Einlesen ein Fehler auftritt.

Eine Engine für eine Serverdatenbank verwenden

SQLAlchemy stellt Engines für Systeme wie PostgreSQL, MySQL und SQL Server bereit, sofern ein passender Treiber installiert ist. Eine Verbindungs-URL bezeichnet Dialekt, Treiber, Server und Datenbank. Bewahre sie in einer Umgebungsvariablen auf:

import os
from sqlalchemy import create_engine

engine = create_engine(os.environ["ANALYSIS_DB_URL"])
try:
    with engine.connect() as conn:
        df = pd.read_sql_query(
            "SELECT region, amount FROM sales", conn
        )
finally:
    engine.dispose()

Der Verbindungskontext gibt die Verbindung an den Pool der Engine zurück. dispose() gibt Ressourcen des Pools frei, wenn die Engine nicht mehr benötigt wird. Verwende für Analysen ein Konto mit reinem Lesezugriff und halte Zugangsdaten aus Notebooks und der Versionsverwaltung heraus. Eine Engine-URL für eine lokale SQLite-Datei kann "sqlite:///shop.db" sein.

Die zur Eingabe passende Lesefunktion wählen
LesefunktionEingabe
read_sql_queryEine SQL-Abfrage und eine Verbindung
read_sql_tableEin Tabellenname und eine SQLAlchemy-Verbindung oder -Engine
read_sqlEine Abfrage oder bei unterstützter Verbindung ein Tabellenname

Übergib bei einer einfachen sqlite3-Verbindung eine vollständige Abfrage. pd.read_sql("sales", con) sendet sales als SQL und schlägt fehl; verwende stattdessen pd.read_sql_query("SELECT * FROM sales", con). pandas unterstützt SQLAlchemy-, ADBC- und SQLite-Verbindungen; eine beliebige direkte Treiberverbindung ist kein unterstützter Ersatz, nur weil der Treiber SQL ausführen kann.

Das benötigte Ergebnis übertragen

Eine Abfrage, die ausgewählte Zeilen und Spalten zurückgibt, überträgt weniger Daten, als eine ganze Tabelle einzulesen und den größten Teil in pandas zu verwerfen. Die vorgegebene Abfrage SELECT SUM(amount) AS total FROM sales liefert einen aggregierten Wert mit der Bezeichnung total. Das Einlesen eines Abfrageergebnisses verändert die gespeicherte Tabelle nicht. Prüfe nach dem Laden Zeilenanzahl und Typen wie bei einer Datei; die deklarierten Datenbanktypen und die zurückgegebenen pandas-Typen hängen zusammen, sind aber nicht identisch.

Wichtige Erkenntnisse

  • SQLite ist eine lokale Dateidatenbank; Serverdatenbanken benötigen eine Verbindung und einen Treiber.
  • Verwende vollständige Abfragen mit einer einfachen SQLite-Verbindung.
  • Lass eine Abfrage die an pandas übertragenen Zeilen und Spalten reduzieren.
  • Halte Zugangsdaten getrennt und verwende für Analysen Lesezugriff.
  • Schließe SQLite-Verbindungen und gib SQLAlchemy-Ressourcen frei.

6.2 Abfragewerte von SQL getrennt halten

Veränderliche Werte gehören in Abfrageparameter. Die SQL-Anweisung legt die Operation fest; gebundene Parameter liefern die Region, den Schwellenwert oder einen anderen für diese Ausführung verwendeten Wert. So bleibt die Abfragestruktur erhalten, selbst wenn ein Wert ein Anführungszeichen enthält.

Werte mit der Syntax der Verbindung binden

Für SQLite:

query = "SELECT region, amount, sold_on FROM sales WHERE amount > ? ORDER BY amount DESC"
df = pd.read_sql_query(query, con, params=(70,))

Für die Verkaufsbeträge 120,0, 75,5, 60,0 und 210,0 gibt dies 210,0, 120,0 und 75,5 in absteigender Reihenfolge zurück. Das Tupel (70,) hat ein Element; (70) ist nur die Zahl 70. SQLite akzeptiert auch benannte Platzhalter, zum Beispiel WHERE region = :r mit params={"r": "North"}.

Die Regeln für Platzhalter hängen von der Schnittstelle ab. psycopg verwendet %s oder %(name)s. Bei SQLAlchemy verpackst du eine Anweisung in text und verwendest benannte Parameter:

from sqlalchemy import text

query = text("SELECT region, amount FROM sales WHERE amount >= :m")
with engine.connect() as conn:
    df = pd.read_sql_query(query, conn, params={"m": 100})

Übergib Werte über params; verwende keine Python-Formatierung, um sie in die Anweisung einzusetzen.

Verstehen, wovor Parametrisierung schützt

Angenommen, Code erstellt eine Bedingung mit einem f-String und einer Eingabe "x' OR '1'='1". Wird sie innerhalb von Anführungszeichen eingesetzt, ändert sich die Bedingung zu region = 'x' OR '1'='1', was auf jede Zeile zutrifft. Das ist SQL-Injection: Ein Wert ist zu ausführbarer Abfragestruktur geworden.

Ein gebundener Parameter wird als ein Wert verglichen, sodass dieselbe Zeichenkette nur auf eine Region zutrifft, die genau diesen Text als Namen hat. Das Binden verarbeitet auch gewöhnliche Namen mit Apostrophen, ohne Anführungszeichen von Hand maskieren zu müssen. Die Regel gilt für Eingaben aus Dateien ebenso wie für Eingaben aus Benutzerformularen.

Parameter stehen für Werte, nicht für Tabellen- oder Spaltennamen. Ein Parameter anstelle eines Tabellennamens wählt diese Tabelle nicht aus. Benötigt ein Programm eine variable Kennung, wähle sie aus einer festen, vom Code kontrollierten Liste.

Typen im Ergebnis steuern

SQLite speichert Datumsangaben häufig als Text. Weise pandas an, sie als Datum einzulesen:

df = pd.read_sql_query(
    "SELECT sold_on, visits FROM observations", con,
    parse_dates=["sold_on"],
    dtype={"visits": "Int64"}
)

Die Datumsspalte enthält nun Datums- und Zeitwerte und eine Anzahl mit SQL NULL verwendet Ganzzahlen mit Fehlwertunterstützung, statt allein wegen der Lücken zu Gleitkommazahlen zu werden. Untersuche das Ergebnis, um die Umwandlung zu prüfen.

Datenblöcke von der Pufferung durch den Treiber unterscheiden

chunksize=1000 gibt einen Iterator von DataFrames mit jeweils höchstens 1.000 Zeilen zurück. Ein Ergebnis mit vier Zeilen ergibt mit chunksize=3 Teile mit drei und einer Zeile. Halte die Verbindung offen, während du sie verarbeitest. Manche Datenbanktreiber puffern weiterhin das gesamte Ergebnis, bevor pandas Datenblöcke liefert; ein serverseitiger Cursor oder eine Streaming-Konfiguration kann zusätzlich nötig sein, um den Speicherbedarf entlang des gesamten Verbindungswegs zu begrenzen.

Wichtige Erkenntnisse

  • Binde veränderliche Werte über params mit der Platzhalterschreibweise der Schnittstelle.
  • Ein positionelles Tupel mit einem Wert benötigt ein abschließendes Komma.
  • Parameter verhindern, dass ein Wert die Abfragestruktur verändert.
  • Wähle variable Tabellen- und Spaltennamen aus einer festen freigegebenen Liste.
  • Lies Datumsangaben als Datum ein und fordere Ergebnistypen für Ganzzahlen mit Fehlwertunterstützung ausdrücklich an.
  • Die pandas-Datenblockgröße bestimmt nicht, wie der Treiber Daten puffert.

6.3 Tabellen schreiben und die beabsichtigte Änderung prüfen

to_sql erstellt eine Datenbanktabelle aus einem DataFrame oder schreibt Zeilen in eine vorhandene Tabelle. Die Optionen bestimmen, ob vorhandene Daten erhalten bleiben, ob der Index zu einer Spalte wird und wie eine Gruppe von Schreibvorgängen bestätigt wird.

Das Verhalten bei vorhandener Tabelle wählen
df.to_sql("sales", con, index=False)

Die Standardeinstellung if_exists="fail" bricht ab, wenn sales bereits existiert. Wähle nur dann einen anderen Modus, wenn seine Wirkung zum beabsichtigten Ladevorgang passt:

ModusVerhalten bei vorhandener Tabelle
failAbbrechen, ohne in die Tabelle zu laden
appendZeilen an den vorhandenen Inhalt anfügen
replaceTabelle löschen und neu erstellen
delete_rowsAlle Zeilen entfernen, die Tabelle behalten und anschließend einfügen

delete_rows ist in pandas 3 verfügbar. Das Ersetzen einer Tabelle entfernt ihre alte Definition einschließlich Schlüsseln, Indizes und Einschränkungen; auch datenbankspezifische Berechtigungen können betroffen sein. Das Löschen der Zeilen erhält die Definition, entfernt aber trotzdem jeden vorhandenen Datensatz. Verwende es für ein beabsichtigtes vollständiges Neuladen, nicht wenn der DataFrame nur einen neuen Datenblock enthält.

Spalten festlegen und in einer Transaktion schreiben

Standardmäßig wird der DataFrame-Index als Spalte geschrieben. Ein unbenannter Index wird zu index; ein benannter Index behält seinen Namen. index_label gibt ihm einen expliziten Namen und index=False schließt ihn aus. Ist eine Kennung bereits eine gewöhnliche Spalte, fügt das Schreiben standardmäßiger Zeilennummern meist keine nützlichen Informationen hinzu.

Mit SQLAlchemy kann dtype Datenbanktypen wählen:

from sqlalchemy import types

with engine.begin() as conn:
    df.to_sql(
        "sales", conn,
        if_exists="append",
        index=False,
        dtype={"sold_on": types.Date()},
        chunksize=1000
    )

engine.begin() bestätigt die Transaktion beim erfolgreichen Verlassen und rollt sie bei einer Ausnahme zurück. Bei einer vorhandenen Tabelle bestimmt weiterhin das gespeicherte Schema, welche Werte eingefügt werden können; dtype ist kein Befehl, um ihre Spalten neu zu gestalten. Transaktionszusicherungen hängen auch davon ab, ob die Datenbank die verwendeten Operationen unterstützt. Das Anfügen innerhalb einer SQLAlchemy-Transaktion hält den Einfügevorgang des Beispiels zusammen.

chunksize gruppiert Zeilen in Blöcke. method="multi" setzt mehrere Zeilen in eine INSERT-Anweisung, wo dies unterstützt wird. Das kann die Leistung abhängig von Datenbank und Blockgröße verbessern oder verschlechtern, miss sie daher mit repräsentativen Daten.

Zuwachs prüfen, nicht nur den Abschluss
check = pd.read_sql_query("SELECT COUNT(*) AS n FROM sales", con)
print(check["n"].iloc[0])

Vergleiche bei einer neuen oder vollständig neu geladenen Tabelle die Anzahl mit len(df). Vergleiche beim Anfügen den Zuwachs: Eine Tabelle mit vier Zeilen, die zwei Zeilen erhält, sollte sechs enthalten. Die von to_sql zurückgegebene Zeilenanzahl beruht auf der Meldung des Treibers; prüfe die gespeicherten Daten direkt.

Führst du einen Anfügevorgang zweimal aus, werden die Datensätze wiederholt, sofern die Datenbank keine Dubletten ablehnt oder das Programm nur neue Datensätze auswählt. Entscheide vor einer erneuten Ausführung, ob die Operation ein vollständiges Neuladen oder das Anfügen neuer Datensätze ist. Eine Transaktion verhindert einen unvollständigen Ladevorgang bei einem Fehler; sie macht wiederholte erfolgreiche Anfügevorgänge nicht eindeutig.

Wichtige Erkenntnisse

  • append fügt Zeilen an; replace löscht die Tabelle; delete_rows erhält ihre Definition.
  • Verwende index=False, sofern der Index nicht zu den gespeicherten Daten gehört.
  • Verwende eine SQLAlchemy-Transaktion, um einen Ladevorgang gemeinsam zu bestätigen oder zurückzurollen.
  • Prüfe einen Anfügevorgang anhand des erwarteten Zuwachses gespeicherter Zeilen.
  • Das Wiederholen eines erfolgreichen Anfügevorgangs kann Datensätze verdoppeln.
  • Die Leistung von Blockgröße und INSERT mit mehreren Zeilen hängt von der Datenbank ab.

Daten laden und speichern in pandas: Beispiele

6 Interaktive Lektionen

1

Eine zuverlässige Tabelle aus Text erstellen

17 Schritte
Arbeite von Rohdatensätzen zu einem geprüften DataFrame und wähle Kopfzeilen, Zahlenformate, Typen und Berichtsgrenzen.
  1. 1
    EinführungZuerst die Struktur, dann die Werte einlesen

    Ein Textexport überlässt wichtige Entscheidungen der Lesefunktion. Ein Komma kann Felder trennen oder innerhalb eines Namens in Anführungszeichen vorkommen; eine Zahl kann ein Messwert oder eine Kennung sein.

    Du legst zuerst Datensätze und Spalten fest, interpretierst dann ihre Werte und entfernst schließlich Berichtsmaterial außerhalb der Tabelle. Untersuche das Ergebnis nach jeder Entscheidung, damit ein erfolgreiches Einlesen keine veränderten Daten verbirgt.

  2. 2
    BeispielDrei Verkaufsdatensätze laden

    Die Verkaufsdatei hat eine Kopfzeile und drei Beobachtungen:

    order_id,date,region,units,price
    1001,2026-03-02,North,3,4.50
    1002,2026-03-02,South,1,12.00
    1003,2026-03-03,North,2,7.25
    

    df = pd.read_csv("sales.csv") erzeugt die Form (3, 5). units ist eine Ganzzahlspalte und price eine Gleitkommaspalte. Die Zeichenketten, die wie Datumsangaben aussehen, müssen noch als Datum eingelesen werden.

  3. 3
    ErklärungJeder Untersuchung einen Zweck geben

    Prüfe mit head(), ob die Felder unter den vorgesehenen Namen stehen, vergleiche mit shape die Abmessungen und untersuche mit dtypes die Interpretation. info() ergänzt die Anzahl nicht fehlender Werte.

    Ist eine numerische Spalte Text, untersuche Rohwerte auf Kennzeichen oder Zahlenschreibweisen. Wird eine Datei nicht gefunden, prüfe das aktuelle Arbeitsverzeichnis: Das Ändern von Spaltenoptionen kann keinen relativen Pfad korrigieren, der auf den falschen Ort zeigt.

  4. 4
    HerausforderungDie erste Beobachtung behalten

    Eine Datei ohne Kopfzeile beginnt mit V12,South,6 und hat 40 Beobachtungen. Ein Einlesen mit Standardeinstellungen ergibt 39 Zeilen und verwendet diese drei Werte als Bezeichnungen. Welche Änderung beim Einlesen behält alle Beobachtungen und gibt nützliche Namen vor?

    ---reveal---

    Verwende header=None, names=["site", "region", "units"]. Der erste Datensatz bleibt in den Daten, sodass die erwartete Form (40, 3) ist. Würdest du Ersatznamen mit header=0 angeben, würde der erste Datensatz weiterhin als Kopfzeile verbraucht.

  5. 5
    KernaussageAnführungszeichen legen die Feldgrenze fest

    Der Datensatz "Smith, Jane",Boston,10 hat drei Felder. Das Komma innerhalb der Anführungszeichen gehört zum Namen. Ein doppeltes Anführungszeichen innerhalb eines Feldes in Anführungszeichen steht für ein einzelnes Anführungszeichen als Inhalt.

    Felder in Anführungszeichen können auch einen Zeilenumbruch enthalten. Lass read_csv die Datensätze interpretieren: Das Aufteilen jeder tatsächlichen Zeile an Kommas kann sowohl falsche Spalten als auch falsche Datensätze erzeugen.

  6. 6
    BeispielDrei verschiedene Zeichen erkennen

    Der Produktexport enthält Tea;3,50;1.200. Ein Semikolon trennt seine Felder, ein Komma kennzeichnet den Nachkommateil des Preises und ein Punkt gruppiert die Ziffern der Menge.

    df = pd.read_csv(
        "products.csv", sep=";",
        decimal=",", thousands="."
    )
    

    Die Werte werden zum Preis 3,5 und zur Menge 1200. Die Trennzeichenoption allein legt die Zahlenschreibweise nicht fest.

  7. 7
    HerausforderungEinen unbemerkten Fehler in der Größenordnung erkennen

    Ein Semikolonexport dokumentiert Mengen als ganze Einheiten. Der Rohwert einer Menge ist "6.400", beim Einlesen nur mit sep=";" ergibt sich aber 6,4. Welche Zahlenoption und welcher erwartete Wert korrigieren die Interpretation?

    ---reveal---

    Verwende thousands=".", um den Punkt als Tausendertrennzeichen zu interpretieren. Das ergibt 6400. Der Wert 6,4 ist bei einer Interpretation des Punkts als Dezimaltrennzeichen numerisch gültig, sodass für diesen Fehler keine Ausnahme auftreten muss. Vergleiche geladene Werte mit der Quelle.

  8. 8
    TippDie Engine passend zu den benötigten Optionen wählen

    Der übliche C-Parser verarbeitet gängige Dateien schnell. Der Python-Parser unterstützt die Erkennung von Trennzeichen, allgemeine reguläre Ausdrücke als Trennzeichen und das Überspringen von Fußbereichen. sep=None kann ein Trennzeichen erkennen, bei unregelmäßigen Berichten aber falsch liegen.

    Gib ein bereits bekanntes Trennzeichen an. Wähle engine="python", wenn du skipfooter verwendest; der PyArrow-Parser hat eigene Einschränkungen bei den Optionen und unterstützt unter anderem kein chunksize.

  9. 9
    BeispielFehlwertkennzeichen spaltenspezifisch festlegen

    Die Punktzahlen sind 88, "n/a", "-" und 999. Die letzten beiden sind als Fehlwertkennzeichen dokumentiert.

    df = pd.read_csv(
        "scores.csv",
        na_values={"score": ["-", "999"]}
    )
    

    Die Punktzahl wird zu 88,0, gefolgt von drei fehlenden Werten. Beschränke die Regel auf score, damit eine tatsächliche 999 in einer anderen Spalte als Wert erhalten bleibt. Ein nicht deklarierter Sentinelwert kann Summen und Mittelwerte verfälschen.

  10. 10
    ErklärungCodes erhalten und Datumsangaben interpretieren

    Eine Kennung wie "00501" muss als Text gespeichert werden, während Anzahlen mit Lücken "Int64" mit Fehlwertunterstützung verwenden können. Auch Datumsangaben benötigen eine eigene Interpretation.

    df = pd.read_csv(
        "visits.csv",
        dtype={"code": str, "visits": "Int64"},
        parse_dates=["day"], date_format="%d/%m/%Y"
    )
    

    Das explizite Muster macht "03/04/2026" zum 3. April. Untersuche anschließend die Datentypen, um zu bestätigen, dass die angeforderte Umwandlung tatsächlich stattgefunden hat.

  11. 11
    HerausforderungEine tatsächliche Bezeichnung und eine Lücke berücksichtigen

    In einer CSV-Datei ist die Zone "NA" eine tatsächliche Bezeichnung. Ein leeres Feld in visits bedeutet fehlend und die bekannten Anzahlen sind Ganzzahlen. Welche Einstellungen für fehlende Werte und Typen erhalten diese Bedeutungen?

    ---reveal---

    Verwende keep_default_na=False, na_values={"visits": [""]}, dtype={"visits": "Int64"}. Die Zonenbezeichnung bleibt erhalten, während leere Besuchsfelder zu fehlenden Werten in einer Ganzzahlspalte werden. Blieben die Standardkennzeichen aktiviert, würde auch die tatsächliche Bezeichnung "NA" entfernt.

  12. 12
    BeispielDie Tabelle im Bericht finden

    Ein Bericht hat drei Zeilen vor seiner Kopfzeile, einen Kommentar mit # im Hauptteil und danach Beobachtungen, gefolgt von einer Summe und einem Quellenhinweis.

    df = pd.read_csv(
        "report.csv", skiprows=3, comment="#",
        skipfooter=2, engine="python"
    )
    

    Die Titelzeilen, der Kommentar und der Fußbereich werden ausgeschlossen. Wenn die Beobachtungen für Januar zusammen 218 ergeben, würde eine beibehaltene Summenzeile mit 218 die Spaltensumme fälschlich auf 436 erhöhen.

  13. 13
    KernaussageNicht jeder fehlerhafte Datensatz löst einen Fehler aus

    Zusätzliche Felder können einen Fehler wegen einer fehlerhaften Zeile auslösen. Zu wenige Felder können stattdessen fehlende Werte am Ende erzeugen: Unter id,name,score wird der Datensatz 2,Ben ohne Punktzahl geladen.

    Das Überspringen fehlerhafter Datensätze verwirft auch ihre Beobachtungen. Prüfe Zeilenanzahlen und Anzahlen fehlender Werte getrennt und untersuche ein falsches Trennzeichen oder ein Feld ohne erforderliche Anführungszeichen, bevor du entscheidest, Datensätze zu entfernen.

  14. 14
    HerausforderungPositionen richtig zuordnen

    Ein Export mit fester Feldbreite weist die Positionen 0 bis 2 einem Code, 3 bis 9 einem Namen und 10 bis 14 einem Wert zu. Welche colspecs passen zu diesen Feldern?

    ---reveal---

    Verwende [(0, 3), (3, 10), (10, 15)]. Jeder Bereich schließt seinen Anfang ein und sein Ende aus; das ergibt die Breiten 3, 7 und 5. Würdest du die Endpunkte 2, 9 und 14 verwenden, ginge das letzte Zeichen jedes Feldes verloren, weil diese Endpunkte ausgeschlossen sind.

  15. 15
    ErklärungMehrstufige oder flache Bezeichnungen wählen

    Wenn zwei Kopfzeilen Gruppen und Jahre beschreiben, erstellt header=[0, 1] Spaltenbezeichnungen mit zwei Ebenen. Eine Umsatzspalte lässt sich dann mit ("sales", "2026") bezeichnen.

    Benötigt die Analyse gewöhnliche flache Namen, überspringe beide Kopfzeilen und gib Namen wie "region", "sales_2025" und "sales_2026" vor. Prüfe, dass keine der Kopfzeilen unter den Beobachtungen verblieben ist.

  16. 16
    HerausforderungOptionen für Aufbau und Werte kombinieren

    Ein Export hat eine Titelzeile und dann die Kopfzeile code;amount;day. Ein Datensatz ist 00018;2.100,50;11/12/2026. Beträge verwenden den Punkt zur Tausendergruppierung und Dezimalkommas; bei Datumsangaben steht der Tag zuerst. Gib die wichtigsten Leseoptionen an.

    ---reveal---

    Verwende skiprows=1, sep=";", thousands=".", decimal=",", dtype={"code": str}, parse_dates=["day"], date_format="%d/%m/%Y". Der Datensatz behält den Code "00018", den Betrag 2100,5 und den 11. Dezember als Datum.

  17. 17
    ZusammenfassungDie Bedeutung der importierten Daten prüfen

    Stimme zuerst Datensatzgrenzen, Kopfzeilen und Tabellengrenzen ab. Lege dann Zahlenschreibweisen, Fehlwertkennzeichen, Kennungstypen und Datumsformate fest.

    Untersuche Abmessungen und Typen, vergleiche ausgewählte Rohwerte und prüfe Lücken und Summen. Ein Parser kann erfolgreich abschließen und dabei eine führende Null verlieren, ein Datum vertauschen oder eine Berichtssumme als Beobachtung zählen. Diese Prüfungen zeigen dir, ob die importierte Tabelle dieselbe Bedeutung wie die Datei hat.

2

Text dekodieren und in Teilen verarbeiten

13 Schritte
Untersuche beschädigte Zeichen und verarbeite anschließend große oder komprimierte Eingaben, ohne den gesamten Datensatz zu behalten.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungZwei unterschiedliche Probleme beim Einlesen
  2. 2
    BeispielEin Zeichen auf dem Weg zu Bytes verfolgen
  3. 3
    ErklärungMarkierungen und Dokumentation nutzen
  4. 4
    HerausforderungDie Signatur interpretieren
  5. 5
    BeispielDie ursprüngliche Interpretation korrigieren
  6. 6
    TippUnlesbare Zeichen nicht entfernen
  7. 7
    HerausforderungAnhaltspunkte höher gewichten als das Ausbleiben eines Fehlers
  8. 8
    ErklärungDen geladenen Speicherbedarf der Tabelle messen
  9. 9
    BeispielEine laufende Summe und Anzahl festhalten
  10. 10
    HerausforderungBeobachtungen gleich gewichten
  11. 11
    KernaussageKompression und blockweise Verarbeitung senken unterschiedliche Kosten
  12. 12
    HerausforderungDen Speichervorteil erhalten
  13. 13
    ZusammenfassungBytes und Teilergebnisse zuverlässig halten
3

Eine Arbeitsmappe einlesen und einen übersichtlichen Bericht erstellen

11 Schritte
Finde Beobachtungen auf Arbeitsblättern, verstehe gespeicherte Zellwerte und speichere mehrere Tabellen, ohne Arbeitsblätter zu verlieren.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungDie Tabelle von ihrer Darstellung trennen
  2. 2
    BeispielDie Beobachtungen in Q1 auswählen
  3. 3
    ErklärungDen gespeicherten Wert einlesen
  4. 4
    KernaussageEine Formel ist keine Aufforderung zur Berechnung
  5. 5
    HerausforderungZwei auffällige Zellen erklären
  6. 6
    TippDie Arbeitsblattsammlung prüfen
  7. 7
    BeispielZwei Arbeitsblätter über einen Writer schreiben
  8. 8
    ErklärungFestlegen, wie ein vorhandenes Arbeitsblatt geändert wird
  9. 9
    HerausforderungVerbliebene Zeilen vermeiden
  10. 10
    HerausforderungEinen Bericht aus mehreren Quellarbeitsblättern erstellen
  11. 11
    ZusammenfassungDie Arbeitsmappe beim Lesen und Schreiben prüfen
4

API-Datensätze in eine Tabelle mit der richtigen Zeilengranularität umwandeln

16 Schritte
Lies JSON ein, erweitere verschachtelte Datensätze und sammle vollständige API-Ergebnisse mit Prüfungen an jeder Schnittstelle.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungVom Antworttext zu Beobachtungen
  2. 2
    BeispielJSON-Werte in Python-Werte umwandeln
  3. 3
    ErklärungEinen Tabellenaufbau ausdrücklich wählen
  4. 4
    HerausforderungEine JSON-Kennung erhalten
  5. 5
    TippAusgetauschtes JSON lesbar und gültig machen
  6. 6
    BeispielMit einer Zeile pro Bestellung beginnen
  7. 7
    BeispielDie ausgewählte Liste erweitern
  8. 8
    KernaussageSummen auf die Zeilengranularität abstimmen
  9. 9
    HerausforderungEinen übergeordneten Datensatz ohne Einträge sichtbar halten
  10. 10
    BeispielDen Status vor dem Erstellen einer Tabelle prüfen
  11. 11
    TippZugang schützen und Wartezeiten beachten
  12. 12
    HerausforderungJede Seite berücksichtigen
  13. 13
    ErklärungDatensätze auspacken und Lücken untersuchen
  14. 14
    VerbindungEin anderes Webformat erkennen
  15. 15
    HerausforderungDas Sammeln von der Normalisierung trennen
  16. 16
    ZusammenfassungJede Schnittstelle der Reihe nach prüfen
5

Entscheiden, was deine gespeicherte Datei erhält

13 Schritte
Steuere CSV-Exporte, vergleiche Speicheroptionen und lies nützliche Teile eines Parquet-Datenbestands mit Datentypen ein.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungFür den nächsten Leser speichern
  2. 2
    BeispielDie vorgesehenen CSV-Felder schreiben
  3. 3
    KernaussageEin Export kann Genauigkeit und Typen verlieren
  4. 4
    HerausforderungNur Datensätze anfügen
  5. 5
    ErklärungSpalten einlesen, ohne jedes Feld einzulesen
  6. 6
    VerbindungFormate den Tätigkeiten zuordnen
  7. 7
    HerausforderungPortabilität und Vertrauen berücksichtigen
  8. 8
    BeispielEine Tabelle mit Datentypen schreiben und lesen
  9. 9
    BeispielEine nützliche Verzeichnisaufteilung verwenden
  10. 10
    HerausforderungTausende winzige Teile vermeiden
  11. 11
    TippDateien mit kompatiblen Typen hinzufügen
  12. 12
    HerausforderungEinen Bericht und einen Analysedatensatz aufbewahren
  13. 13
    ZusammenfassungDie später benötigten Eigenschaften prüfen
6

Abfrageergebnisse einlesen und das Schreiben von Tabellen prüfen

14 Schritte
Verwalte Verbindungen, binde Werte, steuere Ergebnistypen und speichere einen Datenblock mit überprüfter Wirkung in der Datenbank.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungLesen gibt Daten zurück; Schreiben verändert sie
  2. 2
    BeispielAus einer lokalen SQLite-Datenbank einlesen
  3. 3
    ErklärungDie Lebensdauer von Engine und Verbindung verwalten
  4. 4
    HerausforderungEine Abfrage statt einer Tabellenbezeichnung senden
  5. 5
    BeispielEinen veränderlichen Schwellenwert binden
  6. 6
    KernaussageEin Wert kann nicht zur Abfragesyntax werden
  7. 7
    HerausforderungTypen und Parametergrenzen erhalten
  8. 8
    TippDatenblöcke bei offener Verbindung verarbeiten
  9. 9
    ErklärungÜber vorhandene Datensätze entscheiden
  10. 10
    BeispielInnerhalb einer Transaktion anfügen
  11. 11
    HerausforderungDie Änderung und die erneute Ausführung prüfen
  12. 12
    TippGespeicherte Ergebnisse direkt prüfen
  13. 13
    HerausforderungDie Definition erhalten und einen Datenstand ersetzen
  14. 14
    ZusammenfassungDen Aufruf auf seine Datenbankwirkung abstimmen

Daten laden und speichern in pandas: Übungsaufgaben

50 Übungsfragen in 5 Sets

Set 1: Daten einlesen und ihre Bedeutung prüfen10 Übungsfragen

Frage 1 von 10

Eine Datei ohne Kopfzeile beginnt mit S14,East,8. Wie sollte sie eingelesen werden, damit dieser Datensatz erhalten bleibt?
  1. header=0, names=["site", "zone", "count"]
  2. header=None, names=["site", "zone", "count"]
  3. header=1, names=["site", "zone", "count"]
  4. skiprows=1, names=["site", "zone", "count"]
Antwort zeigenAntwort ausblenden
Antwort: B
header=None gibt an, dass keine Bezeichnungszeile vorhanden ist, während names die Bezeichnungen getrennt vorgibt. header=0 würde den ersten Datensatz als Kopfzeile verwenden, selbst wenn Ersatznamen angegeben werden. Die mit S14 beginnende Zeile muss unter den Beobachtungen bleiben.

Frage 2 von 10

Eine Semikolondatei enthält sensor;distance_m, gefolgt von R8;2.450,75. Wie wird die Entfernung zu 2450,75?
  1. sep=";", decimal=".", thousands=","
  2. sep=",", decimal=",", thousands="."
  3. sep=";", decimal=",", thousands=" "
  4. sep=";", decimal=",", thousands="."
Antwort zeigenAntwort ausblenden
Antwort: D
Das Semikolon trennt Felder, das Komma kennzeichnet den Nachkommateil und der Punkt gruppiert Tausender. Diese Einstellungen wandeln die Entfernung in 2450,75 um. Vertauschte Einstellungen für Dezimaltrennzeichen und Gruppierung passen nicht zur Zahl in der Quelle, selbst wenn das Feldtrennzeichen richtig ist.

Frage 3 von 10

In UTF-8 benötigt jeder ASCII-Buchstabe ein Byte und "é" zwei. Wie viele Bytes kodieren "été"?
  1. 5 Bytes
  2. 3 Bytes
  3. 4 Bytes
  4. 6 Bytes
Antwort zeigenAntwort ausblenden
Antwort: A
Die beiden Buchstaben mit Akzent benötigen jeweils zwei Bytes und der ASCII-Buchstabe "t" eines, zusammen also fünf Bytes. Die Zahl drei zählt die Zeichen, nicht ihre kodierte Größe. Dieser Unterschied ist wichtig, wenn du gespeicherte Bytes untersuchst oder ein Kodierungsproblem diagnostizierst.

Frage 4 von 10

Ein Arbeitsblatt hat einen Titel in Zeile 1, eine leere Zeile 2, Bezeichnungen in Zeile 3, drei Beobachtungen in den Zeilen 4 bis 6 und eine Summe in Zeile 7. Welche Leseoptionen wählen die Beobachtungen aus?
  1. skiprows=3, nrows=3
  2. skiprows=2, nrows=4
  3. skiprows=2, nrows=3
  4. skiprows=1, nrows=3
Antwort zeigenAntwort ausblenden
Antwort: C
Das Überspringen von zwei Zeilen macht die dritte Arbeitsblattzeile zur Kopfzeile; anschließend liest nrows=3 die drei Beobachtungen. Das Überspringen von drei Zeilen würde bei der standardmäßigen Behandlung der Kopfzeile die erste Beobachtung als Bezeichnungen verwenden. Vier Datenzeilen einzulesen würde auch die Summe als Beobachtung einschließen.

Frage 5 von 10

Ein Protokoll enthält ein vollständiges JSON-Objekt pro Zeile und kein umschließendes Array. Welche pandas-Leseoption passt zu diesem Aufbau?
  1. orient="split"
  2. lines=False
  3. lines=True
  4. orient="index"
Antwort zeigenAntwort ausblenden
Antwort: C
lines=True weist pandas an, separate JSON-Datensätze zeilenweise einzulesen. Eine Änderung der Ausrichtung allein macht aufeinanderfolgende Objekte nicht zu einem einzelnen gewöhnlichen JSON-Dokument. Das Zeilenformat unterstützt auch blockweises Einlesen, wenn ein großes Protokoll stückweise verarbeitet werden soll.

Frage 6 von 10

Eine Antwort hat die Schlüssel count, next und results; jeder Eintrag in results ist ein verschachtelter Gerätedatensatz. Was sollte für eine Gerätetabelle an json_normalize übergeben werden?
  1. data["results"]
  2. data
  3. data["count"]
  4. data["next"]
Antwort zeigenAntwort ausblenden
Antwort: A
Der Wert von results enthält die Beobachtungsdatensätze. Die Normalisierung dieser Liste erzeugt daher Gerätezeilen und erweitert verschachtelte Objektfelder. Die Normalisierung des gesamten Hüllobjekts erzeugt dagegen eine Zeile für die Hülle und lässt die Datensatzliste in einer Zelle. Behalte die anderen Felder für Sammlungsprüfungen und Paginierung.

Frage 7 von 10

Ein erneuter CSV-Import enthält eine neue Spalte "Unnamed: 0", die nur die alten standardmäßigen Zeilennummern enthält. Welche Änderung beim Export verhindert das?
  1. Verwende header=False.
  2. Verwende na_rep="0".
  3. Verwende mode="a".
  4. Verwende index=False.
Antwort zeigenAntwort ausblenden
Antwort: D
Die CSV-Schreibfunktion übernimmt standardmäßig den DataFrame-Index, sodass dessen unbenannte Zeilennummern als zusätzliche Spalte zurückkommen. index=False lässt diese Bezeichnungen weg. Das Abschalten der Kopfzeile entfernt die tatsächlichen Spaltennamen und behebt nicht das unerwünschte Indexfeld.

Frage 8 von 10

Ein Team benötigt eine breit unterstützte Datei für wiederholte Analysen, die eine geordnete Kategorie und Anzahlen mit Fehlwertunterstützung erhält. Welches Format passt am besten?
  1. CSV-Text
  2. Parquet
  3. JSON-Datensätze
  4. Excel-Arbeitsmappe
Antwort zeigenAntwort ausblenden
Antwort: B
Parquet speichert unterstützte Spaltentypen und Metadaten, sodass diese pandas-Typen einen kompatiblen Roundtrip überstehen können. CSV erhält sichtbare Werte, verliert aber die Kategorienreihenfolge und Metadaten für Ganzzahlen mit Fehlwertunterstützung. Excel ist für Tabellenkalkulationsberichte nützlich, kann aber beim erneuten Einlesen ebenfalls pandas-Typen verändern.

Frage 9 von 10

Eine Datenbank hat eine vorhandene Tabelle readings und con ist eine einfache SQLite-Verbindung. Welcher Aufruf ruft sie als DataFrame ab?
  1. pd.read_sql("readings", con)
  2. pd.read_sql_table("readings", con)
  3. pd.read_sql_query("readings", con)
  4. pd.read_sql_query("SELECT * FROM readings", con)
Antwort zeigenAntwort ausblenden
Antwort: D
Eine vollständige SQL-Abfrage ist über die SQLite-Verbindung ausführbar und ihr Ergebnis wird zu einem DataFrame. Ein einfacher Tabellenname ist über diesen Verbindungsweg keine Abfrage. read_sql_table benötigt eine SQLAlchemy-Verbindung statt einer einfachen sqlite3-Verbindung.

Frage 10 von 10

Eine SQLite-Abfrage enthält WHERE site = ?. Wie sollte der einzelne Wert "West" übergeben werden?
  1. params=("West",)
  2. params=("West")
  3. params={"site": "West"}
  4. params="West"
Antwort zeigenAntwort ausblenden
Antwort: A
Ein SQLite-Positionsplatzhalter benötigt eine Folge von Werten; das abschließende Komma macht daraus ein Tupel mit einem Element. Klammern ohne dieses Komma lassen eine gewöhnliche Zeichenkette entstehen. Ein benanntes Dictionary gehört zu einem passenden benannten Platzhalter wie :site und nicht zu dem hier verwendeten Fragezeichen.
Set 2: Werte über Dateien und Verbindungen hinweg erhalten10 Übungsfragen

Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.

Frage 1 von 10

In einer CSV-Datei ist "NA" eine gültige Zonenbezeichnung und eine leere Anzahl bedeutet fehlend. Welche Konfiguration erhält beide Bedeutungen?
  1. keep_default_na=True, na_values={"count": [""]}
  2. keep_default_na=False, na_values={"zone": ["NA"]}
  3. keep_default_na=False, na_values={"count": [""]}
  4. keep_default_na=True, na_values={"zone": ["NA"]}
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 2 von 10

Eine CSV-Kopfzeile hat vier Felder. Ein späterer Datensatz enthält nur drei und wird ohne Fehler geladen. Was solltest du prüfen?
  1. Die Anzahl fehlender Werte der letzten Spalte und den Rohdatensatz.
  2. Nur die Anzahl fehlender Werte, ohne den Quellaufbau zu beachten.
  3. Nur Warnungen zu abgelehnten Zeilen für den kurzen Datensatz.
  4. Die gesamte Zeilenanzahl als Prüfung auf Vollständigkeit.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 3 von 10

Ein Name aus einer UTF-8-Quelle erscheint nach dem Einlesen als Windows-1252 als "André". Wie lässt sich das angemessen beheben?
  1. Die veränderte Tabelle erneut mit Latin-1 einlesen.
  2. Jedes Nicht-ASCII-Zeichen durch ein Leerzeichen ersetzen.
  3. Die entstellte Tabelle mit einer UTF-8-BOM speichern.
  4. Die Originaldatei erneut mit UTF-8 einlesen.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 4 von 10

Ein Datenblock enthält die nicht fehlenden Werte 2, 6 und 10; ein zweiter enthält 18. Wie groß ist der Gesamtmittelwert?
  1. 12
  2. 9
  3. 6
  4. 18
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Zwei Tabellen müssen auf getrennten Arbeitsblättern einer neuen Arbeitsmappe gespeichert werden. Welches Schreibverfahren erhält beide?
  1. to_excel zweimal mit demselben Dateipfad aufrufen.
  2. Beide über einen ExcelWriter-Kontext schreiben.
  3. Die zweite Tabelle mit header=False an diesen Pfad schreiben.
  4. Für jede Tabelle einen neuen Writer im Schreibmodus öffnen.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Eine API meldet 275 passende Datensätze und gibt Seiten mit höchstens 80 Datensätzen zurück. Wie viele Anfragen werden benötigt, um das vollständige Ergebnis zu sammeln?
  1. 4 Anfragen
  2. 3 Anfragen
  3. 5 Anfragen
  4. 275 Anfragen
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 7 von 10

Ein Parquet-Datenbestand ist in Jahresverzeichnisse partitioniert. Eine Analyse benötigt nur Datensätze aus 2024 und zwei Spalten. Welcher Leseaufruf nutzt beide Eigenschaften?
  1. pd.read_parquet(path, columns=["year"], filters=[("site", "==", 2024)])
  2. pd.read_parquet(path, columns=["site", "value", "year"])
  3. pd.read_parquet(path, filters=[("year", "!=", 2024)])
  4. pd.read_parquet(path, columns=["site", "value"], filters=[("year", "==", 2024)])
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

Eine SQLite-Verbindung wird innerhalb von with con: verwendet. Was muss nach Abschluss der Datenbankarbeit noch geschehen?
  1. Die Verbindung zur Bestätigung neu erstellen.
  2. Den Verbindungspool freigeben.
  3. Die Verbindung ausdrücklich schließen.
  4. Zur Freigabe der Transaktion erneut öffnen.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Ein SQLite-Ergebnis enthält ISO-Datumstext in day und ganzzahlige Anzahlen mit NULL in n. Ein Skript muss einen zur Laufzeit angegebenen Standort auswählen, ohne die Abfragestruktur zu ändern. Welche Kombination passt?
  1. Den Standort in SQL formatieren, day als Datum einlesen und n auf Int64 setzen.
  2. Den Standort mit params binden, day als Text behalten und n auf int64 setzen.
  3. Den Standort mit params binden, day als Datum einlesen und n auf Int64 setzen.
  4. Einen Tabellennamen mit params binden, day als Datum einlesen und n auf Int64 setzen.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

Eine Tabelle hat 32 Zeilen. Ein Datenblock mit fünf Zeilen wird angefügt und nach einer erfolgreichen ersten Ausführung erneut angefügt. Keine Eindeutigkeitsbedingung lehnt ihn ab. Welche Anzahl und Schlussfolgerung passen?
  1. 42 Zeilen; erfolgreiche Wiederholungen können den Datenblock verdoppeln.
  2. 37 Zeilen; das zweite Anfügen ersetzt den ersten Datenblock.
  3. 42 Zeilen; eine Transaktion erkennt doppelte Datensätze immer.
  4. 32 Zeilen; Anfügen verlangt, die Tabelle vorher zu löschen.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Set 3: Importe untersuchen, bevor du der Tabelle vertraust10 Übungsfragen

Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.

Frage 1 von 10

Ein CSV-Datensatz lautet "Field ""A,B""",7. Welche Werte sollte ein standardmäßiger CSV-Parser erzeugen?
  1. Field "A und B" und 7
  2. Field A und B und 7
  3. Field ""A,B"" und 7
  4. Field "A,B" und 7
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 2 von 10

Eine Semikolondatei enthält code;score;day und 00064;999;07/08/2026. Der Code ist eine Kennung, 999 bedeutet nur für die Punktzahl fehlend und bei Datumsangaben steht der Tag zuerst. Welcher Import erhält alle drei Bedeutungen?
  1. sep=";", dtype={"code": int}, na_values={"score": ["999"]}, parse_dates=["day"], date_format="%d/%m/%Y"
  2. sep=";", dtype={"code": str}, na_values={"score": ["999"]}, parse_dates=["day"], date_format="%d/%m/%Y"
  3. sep=";", dtype={"code": str}, na_values={"score": ["999"]}, parse_dates=["day"], date_format="%m/%d/%Y"
  4. sep=";", dtype={"code": str}, na_values={"code": ["999"]}, parse_dates=["day"], date_format="%d/%m/%Y"
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 3 von 10

Pythons open() belässt bei einfacher UTF-8-Dekodierung eine anfängliche UTF-8-BOM in der ersten Spaltenbezeichnung. Welche Kodierungseinstellung entfernt diese Markierung?
  1. encoding="utf-8-sig"
  2. encoding="utf-16-le"
  3. encoding="cp1252"
  4. encoding="ascii"
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 4 von 10

Eine sehr große CSV-Datei hat eine numerische Spalte amount mit einigen Lücken. Das Programm benötigt deren Gesamtmittelwert bei begrenztem Speicher. Welcher Aufbau bleibt korrekt, wenn Datenblöcke unterschiedlich viele gültige Werte enthalten?
  1. Blockmittelwerte aufsummieren und durch die Anzahl der Datenblöcke dividieren.
  2. Summen aufsummieren und durch die angeforderte Datenblockgröße dividieren.
  3. Summe und Anzahl nicht fehlender Werte jedes Datenblocks aufsummieren und einmal dividieren.
  4. Jeden Datenblock behalten und vor der Mittelwertberechnung zusammenfügen.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Eine Arbeitsmappe speichert einen Code als numerischen Wert 537 mit dem Anzeigeformat 00000. Eine Formelzelle hat kein zwischengespeichertes Ergebnis. Was ist beim Einlesen in pandas zu erwarten, wenn für den Code ein Textdatentyp angefordert wird?
  1. Dem Code fehlen die angezeigten Nullen und pandas berechnet die Formel nicht.
  2. Der Code erhält die angezeigten Nullen und pandas berechnet die Formel.
  3. Dem Code fehlen die angezeigten Nullen und pandas berechnet die Formel.
  4. Der Code erhält die angezeigten Nullen und die Formel wird aus ihrem Text eingelesen.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Eine JSON-Zeichenkette enthält [{"device":"00091","active":true}]. Wie sollte pandas sie einlesen, ohne die Zeichenkette als Pfad zu behandeln oder die Nullen der Kennung zu entfernen?
  1. Verwende text direkt und dtype={"device": str}.
  2. Verwende StringIO(text) und dtype={"device": int}.
  3. Verwende json.dumps(text) und dtype={"device": str}.
  4. Verwende StringIO(text) und dtype={"device": str}.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 7 von 10

Eine API gibt HTTP 200 mit gültigem JSON und einer nicht leeren next-URL zurück. Die gesammelte Zeilenanzahl liegt unter count. Eine andere Person berichtet die aktuelle Tabelle als vollständig. Was ist der Fehler?
  1. Die Gesamtzahl sollte durch die Anzahl der ersten Seite ersetzt werden.
  2. Die nächste URL muss auf gesammelte Datensätze zurückverweisen.
  3. Der HTTP-Erfolg wurde mit dem Abschluss aller Seiten verwechselt.
  4. Das Zählfeld des Servers zeigt, dass die Datensätze vollständig sind.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

Ein genauer Analysewert beträgt 6,347. Er wird mit float_format="%.2f" exportiert und später als Zahl eingelesen. Welchen Wert kann diese CSV-Datei wiederherstellen?
  1. 6,347
  2. 6,35
  3. 6,34
  4. 6,3
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Ein nach Jahr partitionierter Datenbestand speichert code für 2025 als Text und in einer vorgesehenen Datei für 2026 als Ganzzahlen. Die neuen Daten enthalten außerdem nur eine Zeile pro nahezu eindeutigem Code. Welche Vorbereitung unterstützt zuverlässiges Einlesen am besten?
  1. Gemischte Codetypen behalten und Jahrespartitionen durch Codepartitionen ersetzen.
  2. Codetypen angleichen und für jeden Code eine Partition erstellen.
  3. Gemischte Codetypen behalten und zur Korrektur auf Spaltenprojektion setzen.
  4. Codetypen angleichen und die nützliche Jahrespartitionierung behalten.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

Eine vorhandene Tabelle hat wichtige Einschränkungen und enthält einen alten vollständigen Datenstand. Ein neuer DataFrame ist der vollständige Ersatz. Welcher Modus erhält die Tabellendefinition beim Laden des neuen Inhalts?
  1. if_exists="append"
  2. if_exists="delete_rows"
  3. if_exists="replace"
  4. if_exists="fail"
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Set 4: Leseoptionen mit gespeicherten Ergebnissen verbinden10 Übungsfragen

Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.

Frage 1 von 10

Eine durch senkrechte Striche getrennte Tabelle speichert ein numerisches Feld in Anführungszeichen: "7,680.25". Das Trennzeichen wird korrekt eingelesen, aber der Betrag bleibt Text. Welche zusätzliche Leseoption passt zur Zahl?
  1. thousands=","
  2. decimal=","
  3. thousands="."
  4. quotechar="|"
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 2 von 10

Ein Bericht beginnt mit zwei Titelzeilen, danach folgt site,jan,feb. Sein Hauptteil enthält eine Zeile # note und endet mit einer Summe sowie einem Quellenhinweis. Welche Konfiguration liest nur Beobachtungen ein, ohne Hinweise als Datensätze zu behandeln?
  1. skiprows=3, comment="#", skipfooter=2, engine="python"
  2. skiprows=2, comment="#", skipfooter=1, engine="python"
  3. skiprows=2, comment="#", skipfooter=2, engine="python"
  4. skiprows=2, comment="#", skipfooter=2, engine="c"
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 3 von 10

Eine laut Dokumentation in UTF-8 kodierte CSV-Datei wurde als Windows-1252 eingelesen, wodurch entstellte Namen entstanden. Diese Tabelle wurde anschließend korrekt als UTF-8 gespeichert. Der ursprüngliche Download existiert noch. Welche Wiederherstellung liefert die beabsichtigten Namen?
  1. Den abgeleiteten Export erneut als UTF-8 einlesen und unverändert speichern.
  2. Das Original erneut als Windows-1252 einlesen und eine UTF-8-BOM hinzufügen.
  3. Den abgeleiteten Export erneut als Latin-1 einlesen und ungültige Bytes ersetzen.
  4. Das Original erneut als UTF-8 einlesen und den abgeleiteten Export neu erstellen.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 4 von 10

Eine Arbeitsmappe enthält History und Current. Nur Current soll ersetzt werden, während History erhalten bleibt. Welche Writer-Einstellung passt?
  1. Schreibmodus, openpyxl-Engine und der Arbeitsblattname Current.
  2. Anfügemodus, openpyxl-Engine und if_sheet_exists="replace".
  3. Anfügemodus, openpyxl-Engine und if_sheet_exists="overlay".
  4. Schreibmodus, XlsxWriter-Engine und index=False für Current.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Eine normalisierte Teiletabelle hat die Zeilen (visit_id, visit_fee, part_cost): (51, 12, 3), (51, 12, 5) und (52, 7, 4). Wie hoch ist die Summe der Besuchsgebühren und Teile für diese beiden Besuche?
  1. 43
  2. 31
  3. 27
  4. 35
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Ein Sammelskript hat Seite 1 eines API-Ergebnisses gespeichert. Seine Anfrage für Seite 2 erhält HTTP 429 mit Retry-After: 45. Welche Fortsetzung erhält die Sammlung und beachtet die Antwort?
  1. 45 Sekunden warten, Seite 2 erneut anfordern und dann den übrigen Seiten folgen.
  2. 45 Sekunden warten, bei Seite 1 neu beginnen und alle Seiten an die gespeicherten Datensätze anfügen.
  3. Seite 3 sofort anfordern und Seite 2 als leeres Ergebnis behandeln.
  4. Den Inhalt der 429-Antwort als Seite 2 speichern und dann deren nächste Seite anfordern.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 7 von 10

Warum ist das Laden einer ungeprüften pickle-Datei einer anderen Person eine andere Vertrauensentscheidung als das Einlesen einer gewöhnlichen CSV-Datei?
  1. Das Laden beweist, dass die Datei vom angegebenen Absender stammt.
  2. Ein erhaltener Datentyp macht eine ungeprüfte pickle-Datei sicher.
  3. Beim Laden des Objekts aus pickle kann Code ausgeführt werden.
  4. Kompatible Bibliotheksversionen verhindern die Codeausführung in pickle.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

Eine Tabelle hat 2 Millionen Zeilen, 60 Spalten und vier Jahre. Eine wiederkehrende Analyse benötigt zwei Spalten für ein Jahr. Welcher Speicher- und Leseaufbau vermeidet unnötige Spalten und Jahresgruppen?
  1. Nach Datensatzkennung partitioniertes Parquet, gefolgt vom Einlesen des gesamten Datenbestands.
  2. Eine CSV-Datei pro Jahr, gefolgt vom Einlesen jeder Spalte jeder Datei.
  3. Eine Parquet-Datei pro Jahr, gefolgt vom Laden aller Dateien vor dem Filtern.
  4. Nach Jahr partitioniertes Parquet mit einer Spaltenliste und einem Jahresfilter.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Ein Programm lässt Benutzer eine Tabelle und einen Schwellenwert wählen. Seine Abfrage verwendet einen Platzhalter für den Tabellennamen und formatiert den Schwellenwert in SQL. Welche Neugestaltung unterstützt die beabsichtigte Auswahl sicher?
  1. Die Tabelle aus einer festen Liste wählen und den Schwellenwert binden.
  2. Tabellenname und Schwellenwert als gewöhnliche Werte binden.
  3. Beide Eingaben formatieren, nachdem Leerzeichen entfernt wurden.
  4. Den Tabellennamen binden, aber einen numerisch aussehenden Schwellenwert formatieren.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

Ein täglicher Datenblock muss an eine vorhandene Tabelle mit Einschränkungen angefügt werden. Ein fehlgeschlagener Datenblock darf keine teilweisen Einfügungen hinterlassen und ein erfolgreicher soll die gespeicherte Anzahl um seine Länge erhöhen. Welcher Aufbau passt?
  1. In einer SQLAlchemy-Transaktion ersetzen und dann die Anzahl mit der Blockgröße vergleichen.
  2. Ohne Transaktion anfügen und dann die Gesamtzahl mit der Blockgröße vergleichen.
  3. Alle Zeilen in einer Transaktion löschen und dann den Zuwachs gegenüber der alten Gesamtzahl prüfen.
  4. Über eine SQLAlchemy-Transaktion anfügen und dann den Zuwachs der Anzahl prüfen.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Set 5: Mehrere Risiken beim Laden und Speichern lösen10 Übungsfragen

Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.

Frage 1 von 10

Eine CSV-Datei enthält die Codes "0072" und "0073", ganzzahlige Anzahlen mit möglichen Fehlwerten und die Datumsangaben "12/01/2026", "26/01/2026". Die Quelle legt fest, dass der Tag zuerst steht. Welche Kombination erhält diese Bedeutungen?
  1. Code als Text, Anzahl als int32, Daten mit %d/%m/%Y eingelesen.
  2. Code als Ganzzahlen, Anzahl als Int64, Daten mit %d/%m/%Y eingelesen.
  3. Code als Text, Anzahl als Int64, Daten mit %d/%m/%Y eingelesen.
  4. Code als Text, Anzahl als Int64, Daten mit %m/%d/%Y eingelesen.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 2 von 10

Eine Lesefunktion verwendet on_bad_lines="skip". Von 1.000 Beobachtungen der Quelle werden 995 geladen; zwei davon haben fehlende Felder am Ende. Was folgt aus diesen Ergebnissen?
  1. Sieben Beobachtungen gingen verloren; jedes fehlende Feld bezeichnet einen übersprungenen Datensatz.
  2. Fünf Beobachtungen gingen verloren; kurze geladene Datensätze müssen noch untersucht werden.
  3. Fünf Beobachtungen gingen verloren; die geladenen Datensätze müssen alle vollständig sein.
  4. Zwei Beobachtungen gingen verloren; der Anzahlunterschied zeigt nur leere Felder.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 3 von 10

Eine kurze Datei wird als Latin-1 ohne Fehler dekodiert, aber die Zeichenkodierung der Quelle ist unbekannt. Welche Anhaltspunkte würden diese Wahl stützen?
  1. Das Ausbleiben einer Dekodierungsausnahme beim Einlesen als Latin-1.
  2. Ein Texteditor öffnet die Datei, ohne ihre Zeichenkodierung anzuzeigen.
  3. Eine reine ASCII-Kopfzeile sieht mit diesem Decoder korrekt aus.
  4. Exportdokumentation und korrekt dekodierte Werte mit Akzenten.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 4 von 10

Eine gzip-komprimierte CSV-Datei wird in Datenblöcken verarbeitet. Eine Person summiert Beträge, dividiert aber durch die Zeilenanzahl einschließlich fehlender Beträge und behält jeden Datenblock in einer Liste. Welche Kombination von Korrekturen erfüllt eine Aufgabe, die nur den Mittelwert bei begrenztem Speicher benötigt?
  1. Nicht fehlende Beträge zählen und nur Summen und Anzahlen behalten.
  2. Jede Zeile zählen und nur den Mittelwert der Blockmittelwerte behalten.
  3. Nicht fehlende Beträge zählen und alle behaltenen Datenblöcke zusammenfügen.
  4. Datenblöcke zählen und ihre Summen ohne Beobachtungszahlen behalten.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Die Formelsumme eines Arbeitsblatts zeigt 90 an, aber das zuletzt gespeicherte Ergebnis ist 74. Eine 16-stellige Gerätekennung wurde als Zahl eingegeben. Welche zwei Einschränkungen müssen berücksichtigt werden, bevor du dem Import vertraust?
  1. Formelergebnisse müssen aktualisiert werden; das Einlesen als Text stellt die vollständige Kennung allein wieder her.
  2. Das angezeigte Formelergebnis ist aktuell; die ursprüngliche vollständige Kennung muss als Text gespeichert werden.
  3. Formelergebnisse müssen aktualisiert werden; die ursprüngliche vollständige Kennung muss als Text gespeichert werden.
  4. Das angezeigte Formelergebnis ist aktuell; das Einlesen als Text stellt die vollständige Kennung allein wieder her.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Ein Hüllobjekt enthält drei Bestellungen mit 2, 1 und 0 Artikeln. Die Artikeltabelle wiederholt die Liefergebühr jeder Bestellung. Benötigt werden sowohl die Bestellanzahl als auch die gesamten Liefergebühren. Welcher Aufbau vermeidet verlorene oder wiederholte Bestellungen?
  1. Artikelzeilen zählen und jede wiederholte Gebühr in der Artikeltabelle summieren.
  2. Nur Bestellungen aus der Artikeltabelle behalten und die größte Gebühr nehmen.
  3. Die Zeilenanzahl der Artikeltabelle als Bestellanzahl nutzen und Gebühren durch drei dividieren.
  4. Eine Bestelltabelle für Anzahlen und Gebühren behalten und mit einer separaten Artikeltabelle verknüpfen.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 7 von 10

Eine verarbeitete CSV-Datei hat eine doppelte Kopfzeile innerhalb der Datensätze, gerundete Messwerte und nach dem erneuten Einlesen beschädigte Kennungen mit führenden Nullen. Welche Kombination von Änderungen behebt die drei Ursachen?
  1. Mit Kopfzeilen anfügen, mit voller Genauigkeit exportieren und Kennungen als Text einlesen.
  2. Ohne Kopfzeilen anfügen, mit voller Genauigkeit exportieren und Kennungen als Text einlesen.
  3. Ohne Kopfzeilen anfügen, beim Einlesen einen breiteren Gleitkommatyp wählen und Kennungen als Ganzzahlen einlesen.
  4. Ohne Kopfzeilen anfügen, gerundete Werte exportieren und Kennungen anschließend in Text umwandeln.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

Eine andere Person benötigt einen Tabellenkalkulationsbericht mit benannten Arbeitsblättern für Messwerte und Anzahlen. Welches Ausgabeformat erfüllt diesen Zweck direkt?
  1. Excel-Arbeitsmappe
  2. JSON-Lines-Datei
  3. Feather-Datei
  4. Parquet-Datenbestand
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Eine gespeicherte Tabelle hat 140 Zeilen. Ein Datenblock mit sieben Zeilen enthält nur neue Datensätze; vorhandene Zeilen und Einschränkungen müssen erhalten bleiben. Welcher Modus und welche Anzahlprüfung passen nach dem Laden?
  1. Ersetzen verwenden und prüfen, dass die gespeicherte Anzahl sieben ist.
  2. Anfügen verwenden und prüfen, dass die gespeicherte Anzahl 147 ist.
  3. Anfügen verwenden und prüfen, dass die gespeicherte Anzahl sieben ist.
  4. delete_rows verwenden und prüfen, dass die gespeicherte Anzahl 147 ist.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

Eine Tabelle mit Einschränkungen hat 80 Zeilen. Ein Anfügevorgang mit 12 Zeilen innerhalb einer unterstützten Transaktion schlägt nach dem Einfügen von fünf Zeilen fehl und die Ausnahme verlässt den Transaktionsblock. Welche Anzahl sollte bleiben und was würde ein erfolgreicher erneuter Versuch ergeben?
  1. 80 nach dem Zurückrollen; 92 nach einem erfolgreichen erneuten Versuch.
  2. 85 nach dem Fehler; 97 nach einem erfolgreichen erneuten Versuch.
  3. 80 nach dem Zurückrollen; 80 nach einem erfolgreichen erneuten Versuch.
  4. 92 nach dem Fehler; 104 nach einem erfolgreichen erneuten Versuch.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Hängst du bei deiner eigenen Aufgabe fest? Hausaufgabenhilfe

Schlüsselbegriffe

91 Schlüsselbegriffe, jeweils mit Definition

A

Anfrageratenbegrenzung
Eine Anfrageratenbegrenzung beschränkt die Anzahl der Anfragen, die ein Client in einem Zeitraum senden darf, und signalisiert zu viele Anfragen häufig mit HTTP 429.
Warte gemäß Retry-After, bevor du eine Anfrage erneut versuchst, die wegen Überschreitens der zulässigen Rate abgelehnt wurde.
Anfügemodus
Der Anfügemodus öffnet eine vorhandene Arbeitsmappe für Aktualisierungen und ermöglicht, Arbeitsblätter hinzuzufügen oder nach einer Regel für Namenskollisionen zu behandeln.
Ein openpyxl-Writer im Anfügemodus kann ein vorhandenes Arbeitsblatt ersetzen und dabei die anderen Arbeitsblätter der Arbeitsmappe erhalten.
Anfügen
Anfügen ergänzt eine vorhandene Tabelle um neue Zeilen, ohne ihre bisherigen Datensätze zu entfernen, sodass die Wiederholung eines Datenblocks doppelte Datensätze hinzufügen kann.
Eine Tabelle mit 11 Zeilen hat nach vier erfolgreichen Einfügungen 15 und kann nach Wiederholung dieses Anfügevorgangs 19 haben.
Anzeigeformat
Ein Anzeigeformat verändert die Darstellung eines gespeicherten Zellwerts, etwa als Prozentwert oder mit Nullen aufgefüllter Code, ohne den zugrunde liegenden Wert zu ändern.
Eine als "15%" angezeigte Zelle speichert 0,15, sodass der geladene Wert ein Anteil und nicht die Zahl 15 ist.
API-Hüllobjekt
Ein API-Hüllobjekt ist ein umschließendes Objekt, das Datensätze zusammen mit Informationen wie einer Ergebnisanzahl und dem Ort der nächsten Seite enthält.
Wandle die Ergebnisliste des Hüllobjekts in eine flache Tabelle um und behalte den Wert für die nächste Seite für eine weitere Anfrage.
API-Schlüssel
Ein API-Schlüssel ist ein Zugangsnachweis, den ein Client mit der dokumentierten Authentifizierungsmethode der API sendet, um autorisierten Zugriff zu erhalten.
Lies einen privaten Schlüssel aus einer Umgebungsvariablen, statt ihn in einer Notebook-Zelle zu speichern.
Arbeitsblatt
Ein Arbeitsblatt ist ein einzelnes benanntes Zellgitter innerhalb einer Arbeitsmappe, das in pandas anhand seines Namens oder seiner bei null beginnenden Position ausgewählt wird.
Die Verwendung von sheet_name=1 liest das zweite Arbeitsblatt, das sich von dem auf dem Bildschirm geöffneten Blatt unterscheiden kann.
Arbeitsmappe
Eine Arbeitsmappe ist eine Tabellenkalkulationsdatei mit einem oder mehreren Arbeitsblättern sowie Zellwerten, Typen, Formeln und Darstellungsdetails.
Eine einzelne .xlsx-Arbeitsmappe kann getrennte Arbeitsblätter für Beobachtungen, Summen und eine Berichtszusammenfassung enthalten.
ASCII
ASCII definiert 128 grundlegende Zeichen, deren Bytewerte auch in UTF-8 und mehreren gängigen westlichen Ein-Byte-Kodierungen gelten.
Eine rein englische Kopfzeile kann korrekt erscheinen, selbst wenn die für spätere Namen mit Akzenten verwendete Zeichenkodierung falsch ist.
Ausgabegenauigkeit
Die Ausgabegenauigkeit ist die Anzahl der Stellen, die in geschriebenen Werten erhalten bleiben und durch numerische Exportformatierung dauerhaft verringert werden kann.
Ein beim Schreiben gerundeter Bericht benötigt eine separate Analysedatei mit voller Genauigkeit, wenn die verworfenen Stellen wichtig sind.

B

Byte
Ein Byte ist eine Einheit gespeicherter Daten mit 256 möglichen Werten von 0 bis 255, die unter anderem zur Darstellung von Text verwendet wird.
Vier sichtbare Zeichen in einem Namen können fünf Bytes benötigen, wenn ein Zeichen in UTF-8 zwei Bytes belegt.
Byte Order Mark
Eine Byte Order Mark, kurz BOM, ist eine anfängliche Markierung, mit der manche Textdateien Kodierungsinformationen wie die Bytereihenfolge von UTF-16 angeben.
Die Verwendung von utf-8-sig beim Einlesen von Text in Python entfernt eine führende UTF-8-BOM aus der ersten Spaltenbezeichnung.

C

CSV
Eine CSV-Datei ist eine Textdatei mit Datensätzen, deren Felder durch ein Trennzeichen getrennt sind. Anführungszeichen schützen Trennzeichen innerhalb von Feldern.
Eine Adresse mit Komma bleibt in einem Feld, wenn sie in der CSV-Datei korrekt in Anführungszeichen gesetzt ist.
CSV-Roundtrip
Ein CSV-Roundtrip schreibt eine Tabelle als Text und liest sie erneut ein, wobei Typen rekonstruiert werden müssen, die CSV nicht als Metadaten speichert.
Eine geordnete Kategorie kann als gewöhnlicher Text zurückkommen, selbst wenn jede sichtbare Bezeichnung unverändert bleibt.

D

Darstellung fehlender Werte
Eine Darstellung fehlender Werte ist der Text, der für einen fehlenden Wert geschrieben wird, etwa ein leeres Feld oder ein gewähltes Exportkennzeichen.
Wird fehlender Niederschlag als "NA" geschrieben, bleibt er von einer aufgezeichneten Null unterscheidbar, wenn der Empfänger ihn korrekt einliest.
Datei mit fester Feldbreite
Eine Datei mit fester Feldbreite speichert Felder an festgelegten Zeichenpositionen, statt sie durch ein Trennzeichen voneinander abzugrenzen.
Verwende explizite Breiten, wenn ein Geräteexport vier Zeichen für einen Code und sieben für einen Namen reserviert.
Datenbanktreiber
Ein Datenbanktreiber ist die Bibliothek, die die Kommunikation zwischen Pythons Datenbankschnittstelle und einem bestimmten Datenbanksystem implementiert.
Eine PostgreSQL-SQLAlchemy-URL kann psycopg auswählen, das für die Verbindung ebenfalls installiert sein muss.
Datenbankverbindung
Eine Datenbankverbindung ist eine aktive Schnittstelle, über die ein Programm Datenbankoperationen sendet und deren Ergebnisse empfängt.
Halte die Verbindung offen, bis ein Abfrageergebnis in Datenblöcken vollständig verarbeitet wurde, und schließe sie dann.
Datenblock
Ein Datenblock ist eine begrenzte Gruppe von Datensätzen, die eine iterative Lesefunktion liefert, sodass ein Programm jeweils einen Teil einer Datei verarbeiten kann.
Eine Eingabe mit 13 Zeilen, die in Blöcken von fünf eingelesen wird, ergibt DataFrames mit fünf, fünf und drei Zeilen.
Datensatz
Ein Datensatz ist ein vollständiger Eintrag aus Feldern in einer Datei mit Trennzeichen; Inhalt in Anführungszeichen kann dazu führen, dass er sich über mehr als eine tatsächliche Zeile erstreckt.
Ein Kommentar mit einem eingebetteten Zeilenumbruch kann zwei tatsächliche Zeilen belegen und dennoch zu einem Datensatz gehören.
Datensatzpfad
Ein Datensatzpfad wählt die verschachtelte Liste aus, deren Einträge zu Ausgabezeilen werden, wenn pandas eine Sammlung von JSON-Objekten normalisiert.
Die Einstellung record_path="items" erstellt für jedes Element der Artikelliste einer Bestellung eine Artikelzeile.
Datumsformat
Ein Datumsformat ist ein Muster, das einem Parser angibt, wie Datumsbestandteile wie Tag, Monat und vierstelliges Jahr angeordnet sind.
Das Muster %d/%m/%Y macht "09/10/2026" zum 9. Oktober statt zum 10. September.
Dekodierung
Die Dekodierung wandelt gespeicherte Bytes nach einer angegebenen Zeichenkodierung in Text um und bestimmt damit, welche Zeichen im Ergebnis erscheinen.
Das Öffnen einer UTF-8-Datei mit einem älteren Decoder kann entstellte Akzente erzeugen, ohne einen Fehler auszulösen.
Dezimaltrennzeichen
Ein Dezimaltrennzeichen trennt den ganzzahligen Teil einer Zahl von ihrem Nachkommateil; pandas kann beim Einlesen von Text ein gewähltes Zeichen interpretieren.
Mit Dezimalkomma steht "8,75" für denselben Wert wie 8.75 in einer Python-Ausgabe.

E

Endpunkt
Ein Endpunkt ist eine dokumentierte URL, an der eine API eine HTTP-Anfrage für eine bestimmte Ressource oder Operation entgegennimmt.
Ein Endpunkt kann einen Stadtparameter entgegennehmen und passende Messdatensätze in einer JSON-Antwort zurückgeben.
Ersetzungszeichen
Das Ersetzungszeichen "�" markiert Inhalt, den ein Decoder nicht interpretieren konnte, wenn er angewiesen wurde, ungültige Bytes zu ersetzen.
Ein als "Ren�" geladener Name hat Zeicheninformationen verloren; bewahre die ursprünglichen Bytes für ein korrigiertes Einlesen auf.
Excel-Engine
Eine Excel-Engine ist eine Bibliothek, mit der pandas ein Tabellenkalkulationsformat liest oder schreibt; die Unterstützung hängt vom Dateityp ab.
Eine fehlende openpyxl-Installation kann das Einlesen einer .xlsx-Datei verhindern, selbst wenn pandas installiert ist.
ExcelWriter
Ein ExcelWriter verwaltet einen Schreibvorgang für eine Arbeitsmappe, sodass mehrere DataFrames auf verschiedenen Arbeitsblättern abgelegt werden können, bevor die Datei geschlossen wird.
Werden zwei Tabellen über einen Writer geschrieben, bleiben beide Arbeitsblätter in derselben fertigen Berichtsarbeitsmappe.

F

Feather
Feather ist ein auf Arrow IPC basierendes Binärformat für den schnellen Austausch von DataFrames mit Datentypen zwischen kompatiblen Analysewerkzeugen.
Ein lokaler Python-Schritt kann eine Feather-Tabelle für einen späteren Schritt oder einen kompatiblen R-Arbeitsablauf speichern.
Fehlerhafte Zeile
Eine fehlerhafte Zeile ist ein Datensatz, den der Parser nicht in den erwarteten Aufbau einpassen kann, etwa weil er mehr Felder enthält, als die Kopfzeile beschreibt.
Ein nicht durch Anführungszeichen maskiertes Trennzeichen innerhalb eines Namens kann eine gültige Beobachtung so erscheinen lassen, als enthalte sie ein zusätzliches Feld.
Fehlwertkennzeichen
Ein Fehlwertkennzeichen ist ein Quellwert, der für eine fehlende Beobachtung steht und beim Einlesen in einen fehlenden Wert umgewandelt wird.
Wenn "-" für eine fehlende Punktzahl steht, verhindert seine Deklaration als fehlend, dass die Punktzahlspalte Text bleibt.
Fußbereich
Ein Fußbereich ist abschließendes Berichtsmaterial außerhalb der Beobachtungstabelle, etwa Summen, Quellenhinweise oder Erläuterungen zum Export.
Überspringe die letzten zwei Berichtszeilen, wenn sie statt Beobachtungen eine Summe und einen Quellenhinweis enthalten.

G

Ganzzahldatentyp mit Fehlwertunterstützung
Ein Ganzzahldatentyp mit Fehlwertunterstützung ist ein pandas-Ganzzahltyp, der neben ganzen Zahlen auch fehlende Einträge enthalten kann, etwa der Datentyp Int64.
Eine Spalte mit Besuchszahlen kann 3 und 8 als Ganzzahlen behalten und jede leere Beobachtung darin als <NA> darstellen.
Gebundener Parameter
Ein gebundener Parameter stellt einen Datenwert getrennt von der SQL-Syntax bereit und verhindert, dass Zeichen in diesem Wert die Abfrage neu bestimmen.
Ein Regionsname mit einem Apostroph bleibt ein einzelner Vergleichswert, wenn er als Parameter übergeben wird.
Gewichtetes arithmetisches Mittel
Ein gewichtetes arithmetisches Mittel gibt beim Kombinieren ungleich großer Datengruppen jedem Teilmittelwert einen Einfluss proportional zu seiner Anzahl gültiger Beobachtungen.
Ein Datenblock mit einem Datensatz darf bei der Berechnung des Gesamtmittelwerts nicht so stark zählen wie ein Datenblock mit hundert Datensätzen.

H

Halboffenes Intervall
Ein halboffenes Intervall schließt seine Anfangsposition ein und seine Endposition aus, wie es für Spaltengrenzen bei fester Feldbreite verwendet wird.
Der Bereich (2, 7) wählt fünf Zeichenpositionen aus und endet unmittelbar vor Position 7.
HDF5
HDF5 ist ein hierarchisches Binärformat, das mehrere Datenbestände in einer Datei organisieren kann und häufig für große wissenschaftliche Daten verwendet wird.
pandas benötigt PyTables, um mehrere Analysedatensätze über seine HDF5-Schnittstelle zu schreiben.
HTTP-Statuscode
Ein HTTP-Statuscode ist eine Antwortnummer, die das Ergebnis einer Anfrage meldet, wobei 4xx- und 5xx-Codes Fehlerklassen anzeigen.
Prüfe auf einen Fehlerstatus, bevor du eine JSON-Fehlermeldung in etwas umwandelst, das wie eine Datentabelle aussieht.

I

Indexexport
Ein Indexexport schreibt DataFrame-Zeilenbezeichnungen in eine Ausgabespalte. Das ist nur nützlich, wenn diese Bezeichnungen zu den ausgetauschten Daten gehören.
Schließe einen gewöhnlichen nummerierten Index aus, um nach dem erneuten CSV-Einlesen eine neue Spalte "Unnamed: 0" zu vermeiden.

J

JSON
JSON ist ein Textformat für Objekte, Arrays, Zeichenketten in doppelten Anführungszeichen, Zahlen, boolesche Werte und null, das häufig für ausgetauschte verschachtelte Datensätze verwendet wird.
Eine JSON-API kann eine Liste von Stationsobjekten zurückgeben, die jeweils einen Namen und eine Temperaturreihe enthalten.
JSON Lines
JSON Lines ist ein Textaufbau mit einem vollständigen JSON-Objekt pro Zeile, ohne ein äußeres Array, das alle Datensätze umschließt.
Große Protokollexporte können in Datenblöcken eingelesen werden, wenn pandas mitgeteilt wird, dass die Eingabe JSON Lines verwendet.
JSON-Array
Ein JSON-Array ist eine geordnete Folge von Werten in eckigen Klammern, die beim Einlesen in eine Python-Liste umgewandelt wird.
Ein Temperaturarray kann numerische Beobachtungen mit null für eine fehlende Messung mischen.
JSON-Ausrichtung
Eine JSON-Ausrichtung legt fest, wie Zeilen, Spalten, Bezeichnungen und Werte einer Tabelle innerhalb einer JSON-Darstellung angeordnet sind.
Die Ausrichtung records schreibt jede Beobachtung als Objekt, während split Bezeichnungen und Daten getrennt hält.
JSON-Objekt
Ein JSON-Objekt ist eine Sammlung von Werten mit Zeichenketten als Namen in geschweiften Klammern, die Pythons JSON-Parser in ein Dictionary umwandelt.
Ein Objekt kann "active" den Wert true und "name" die Textbezeichnung einer Station zuordnen.

K

Kategoriale Spalte
Eine kategoriale Spalte speichert Werte über eine festgelegte Auswahl von Bezeichnungen und spart häufig Speicher, wenn viele Zeilen einige wenige Bezeichnungen wiederholen.
Vier Regionsbezeichnungen, die sich über Tausende Datensätze wiederholen, eignen sich für die kategoriale Speicherung.
Kennung
Eine Kennung ist eine Bezeichnung für einen Datensatz oder eine Entität, deren Ziffern eine Bedeutung tragen können, ohne eine Größe für Berechnungen darzustellen.
Wird ein Gerätecode wie "00028" als Text eingelesen, bleiben die Nullen erhalten, die für den Abgleich mit demselben Code in einer Quellliste benötigt werden.
Kompression
Kompression kodiert Daten in weniger gespeicherten Bytes und verringert so die Dateigröße, erfordert aber eine Dekompression, bevor ihre Werte verwendet werden können.
pandas kann eine .csv.gz-Datei beim Einlesen dekomprimieren, ohne zuerst eine unkomprimierte Kopie zu erstellen.
Kompressionscodec
Ein Kompressionscodec ist ein Algorithmus zum Komprimieren und Dekomprimieren gespeicherter Daten, der Dateigröße und Verarbeitungskosten gegeneinander abwägt.
Snappy ist die pandas-Parquet-Standardeinstellung; ein anderer Codec kann kleinere Dateien bei anderen Schreibkosten ergeben.
Kopfzeile
Eine Kopfzeile ist eine Zeile mit Feldbezeichnungen, die eine Lesefunktion als Spaltennamen verwendet, statt sie als Beobachtung zu behandeln.
Gib bei einer Datei ohne Kopfzeile Spaltennamen vor, damit die erste Messung in der Tabelle bleibt.

L

Latin-1
Latin-1 ist eine Ein-Byte-Kodierung, die jedem Bytewert ein Zeichen zuordnet, darunter in einem Teil ihres Bereichs Steuerzeichen.
Das Einlesen mit Latin-1 kann ohne Fehler abschließen und dennoch ein beabsichtigtes Symbol in das falsche Zeichen umwandeln.

M

Maskierung durch Anführungszeichen
Die Maskierung durch Anführungszeichen schließt ein Textfeld ein, sodass Trennzeichen oder Zeilenumbrüche darin als Inhalt statt als Datensatzstruktur behandelt werden.
Das Feld "Harbor, West" behält sein Komma beim CSV-Import innerhalb eines Ortsnamens.

N

Normalisierung
Die Normalisierung verschachtelter JSON-Daten erweitert ausgewählte Objektfelder und Listendatensätze zu einer Tabelle mit ausdrücklich gewählter Zeilengranularität.
Die Normalisierung von Kundenobjekten mit Bestellungen kann Spalten mit Punkten in den Namen erstellen, ohne die Artikelliste jeder Bestellung zu erweitern.

P

Paginierung
Paginierung teilt ein API-Ergebnis in separat angeforderte Seiten auf und bietet ein dokumentiertes Verfahren, um die übrigen Datensätze abzurufen.
Eine Sammlung von 260 Datensätzen, die in Seiten zu 100 zurückgegeben wird, benötigt drei Anfragen, um jeden Datensatz abzurufen.
Parquet
Parquet ist ein offenes spaltenorientiertes Dateiformat mit Datentypen und Kompression, das beim Lesen und Speichern von Analysetabellen breit unterstützt wird.
Eine Kennung und eine Anzahl mit Fehlwertunterstützung können ihre Typen bei einem kompatiblen pandas-Parquet-Roundtrip behalten.
Parser
Ein Parser ist die Implementierung, die einen Textaufbau in Werte einliest und eine eigene Geschwindigkeit sowie unterstützte Optionen hat.
Ein Bericht, der skipfooter benötigt, verwendet den Python-Parser, weil der C-Parser diese Option nicht unterstützt.
Partitionierter Datenbestand
Ein partitionierter Datenbestand teilt Tabellendateien anhand ausgewählter Feldwerte auf Verzeichnisse auf, sodass Lesefunktionen nicht benötigte Gruppen überspringen können.
Verzeichnisse mit den Namen year=2025 und year=2026 lassen einen Jahresfilter den benötigten Teil auswählen.
Pickle
Ein Pickle ist eine serialisierte Darstellung eines Python-Objekts, die beim Laden Code ausführen kann und von kompatiblen Bibliotheken abhängt.
Verwende ein vertrauenswürdiges eigenes Pickle für ein temporäres Objekt und wähle für den Austausch ein portables Tabellenformat.
Platzhalter
Ein Platzhalter markiert die Position eines gebundenen Werts in SQL und verwendet die vom Treiber oder der Abfrageschnittstelle verlangte Syntax.
SQLite akzeptiert ? für Positionswerte und :name für Werte, die in einem Dictionary übergeben werden.
Projektion
Projektion wählt die Spalten aus, die aus einer gespeicherten Tabelle eingelesen werden sollen, sodass eine spaltenorientierte Lesefunktion nicht benötigte Spalten auf dem Datenträger lassen kann.
Übergib eine Spaltenliste an read_parquet, wenn eine Analyse nur Region und Betrag benötigt.
Prüfung des Schreibergebnisses
Die Prüfung des Schreibergebnisses vergleicht gespeicherte Datenbankergebnisse mit der beabsichtigten Änderung, etwa dem erwarteten Zuwachs der Zeilenanzahl nach einem Anfügevorgang.
Frage nach dem Hinzufügen von sechs Zeilen zu einer Tabelle mit 20 die Anzahl ab und prüfe, ob die erwartete Gesamtzahl 26 beträgt.

R

Relationale Datenbank
Eine relationale Datenbank speichert Datensätze in Tabellen mit benannten Spalten und lässt Programme Daten über SQL-Operationen abrufen oder ändern.
Eine Abfrage kann nur die benötigten Zeilen und Spalten zurückgeben, bevor pandas eine Analysetabelle erstellt.
Rohdaten
Rohdaten sind die unveränderten Eingaben, die für eine Analyse erhalten oder heruntergeladen und getrennt von abgeleiteten und bereinigten Ausgabedateien aufbewahrt werden.
Bewahre die erhaltene Messdatei auf, damit eine spätere Korrektur der Dekodierung oder des Einlesens bei ihren ursprünglichen Bytes beginnen kann.
Rollback
Ein Rollback macht nicht bestätigte Änderungen einer Transaktion rückgängig, wenn sie nicht erfolgreich abgeschlossen werden kann, und stellt den vorherigen bestätigten Zustand wieder her.
Schlägt ein unterstützter Einfügevorgang innerhalb einer Engine-Transaktion fehl, können seine früheren Einfügungen zurückgerollt werden.

S

Schema
Ein Schema beschreibt die Struktur eines Datenbestands einschließlich Spaltennamen und Typen, die kompatible Lesefunktionen zur Interpretation gespeicherter Werte verwenden.
Ein gemeinsam genutzter Datenbestand benötigt kompatible Codespaltentypen über seine Dateien hinweg, um fehlgeschlagenes Einlesen oder veränderte Werte zu vermeiden.
Sentinelwert
Ein Sentinelwert ist ein festgelegter Code für eine besondere Bedeutung, etwa unbekannt, der sonst wie ein gewöhnlicher Messwert aussehen kann.
Eine dokumentierte Punktzahl von 999 für unbekannt muss vor der Berechnung eines aussagekräftigen Mittelwerts als fehlend deklariert werden.
Serialisierung
Serialisierung wandelt Objekte im Arbeitsspeicher in eine gespeicherte oder ausgetauschte Darstellung um, etwa indem Python-Werte als JSON-Text geschrieben werden.
Verwende json.dump, um Datensätze in eine geöffnete UTF-8-Datei zu serialisieren, statt die Python-Darstellung eines Dictionarys zu schreiben.
Serverseitiger Cursor
Ein serverseitiger Cursor ermöglicht einer Datenbankschnittstelle, ein Ergebnis schrittweise abzurufen, statt es auf einmal vollständig zu puffern.
Die blockweise Verarbeitung in pandas benötigt möglicherweise zusätzlich Streaming-Unterstützung, um eine vollständige Ergebnispufferung durch den Datenbanktreiber zu vermeiden.
Spalten mit MultiIndex
Spalten mit MultiIndex haben Spaltenbezeichnungen mit mehreren Ebenen, die pandas aus mehr als einer Kopfzeile erstellen kann.
Eine Umsatztabelle kann eine Spalte sowohl mit ihrem Messwert als auch mit ihrem Jahr bezeichnen, etwa ("sales", "2026").
Spaltenorientierte Speicherung
Spaltenorientierte Speicherung hält die Werte einer Spalte zusammen und unterstützt so das Einlesen ausgewählter Spalten und die Kompression ähnlicher benachbarter Werte.
Eine Analyse, die zwei Felder benötigt, kann vermeiden, die anderen Spalten eines breiten Parquet-Datenbestands einzulesen.
Speicherbedarf einschließlich Objektinhalten
Der Speicherbedarf einschließlich Objektinhalten zählt den Speicher für abgelegte Werte, einschließlich der Inhalte von Textobjekten, über die bloße Größe ihrer Arrays hinaus.
Verwende eine Speicherbedarfsanzeige einschließlich Objektinhalten, um wiederholte Regionsnamen als Text und als Kategorien zu vergleichen.
SQL-Injection
SQL-Injection tritt auf, wenn eingefügter Text die Struktur einer SQL-Operation verändert, statt ein gewöhnlicher Datenwert zu bleiben.
Eine Eingabe mit Anführungszeichen und einer wahren Bedingung kann eine durch Zeichenkettenformatierung erstellte Abfrage ausweiten.
SQLAlchemy-Engine
Eine SQLAlchemy-Engine konfiguriert den Datenbankzugriff über einen Treiber und verwaltet einen Pool von Verbindungen, die bei der Ausführung von Operationen bezogen werden.
Ein Verbindungskontext gibt seine Verbindung an den Pool zurück; das Freigeben der Engine gibt die Ressourcen des Pools frei.
SQLite
SQLite ist eine Datenbank-Engine, die ohne separaten Server läuft und häufig eine ganze Datenbank in einer lokalen Datei speichert.
Beim Verbinden mit einem falsch geschriebenen Datenbankpfad kann eine neue Datei erstellt werden, in der die erwarteten Tabellen fehlen.

T

Tabellenersetzung
Eine Tabellenersetzung löscht eine vorhandene Datenbanktabelle und erstellt sie neu, wobei ihre frühere Definition ebenso wie ihre Datensätze entfernt werden.
Das Ersetzen einer gemeinsam genutzten Tabelle kann Schlüssel und Indizes entfernen, die Teil ihres ursprünglichen Aufbaus waren.
Tausendertrennzeichen
Ein Tausendertrennzeichen gruppiert Ziffern innerhalb eines numerischen Feldes und muss vom Dezimaltrennzeichen und vom Feldtrennzeichen unterschieden werden.
Ein gruppierter Wert in der Schreibweise "4.200,50" verwendet einen Punkt für Tausender und ein Komma für den Nachkommateil.
Teilaggregat
Ein Teilaggregat ist ein verdichtetes Ergebnis für einen Datenteil, das sich nach einer geeigneten Regel mit Ergebnissen anderer Teile kombinieren lässt.
Summen von Datenblöcken lassen sich direkt addieren, ein Gesamtmittelwert benötigt aber die Gesamtsumme und die Anzahl nicht fehlender Werte.
Transaktion
Eine Transaktion gruppiert Datenbankänderungen innerhalb der von der Datenbank unterstützten Operationen für eine Bestätigung bei Erfolg oder ein Zurückrollen bei einem Fehler.
Eine SQLAlchemy-Transaktion kann verhindern, dass bei einem Anfügevorgang nur einige der vorgesehenen Datensätze gespeichert bleiben.
Trennzeichen
Ein Trennzeichen ist ein Zeichen oder Muster, das die Grenze zwischen Feldern kennzeichnet, etwa ein Komma, Tabulator, senkrechter Strich oder ein Semikolon.
Eine semikolongetrennte Datei benötigt sep=";", selbst wenn ihre Dateiendung .csv ist.
Typinferenz
Typinferenz ist die Wahl eines Spaltentyps durch die Lesefunktion anhand der Eingabewerte, wenn das Programm diesen Typ nicht vorgegeben hat.
Ein Gerätecode, der nur aus Ziffern besteht, kann zu einer Ganzzahl werden, wenn die Lesefunktion nicht angewiesen wird, ihn als Text zu erhalten.

U

UnicodeDecodeError
Ein UnicodeDecodeError tritt auf, wenn ein Decoder auf eine Bytefolge trifft, die er mit der gewählten Zeichenkodierung nicht interpretieren kann.
Ein Zeichen mit Akzent in Windows-1252 kann diesen Fehler auslösen, wenn die Datei als UTF-8 geöffnet wird.
UTF-8
UTF-8 stellt Unicode-Zeichen mit einem bis vier Bytes dar, speichert ASCII-Zeichen in einem Byte und unterstützt jedes Unicode-Zeichen.
Der Buchstabe "é" benötigt in UTF-8 zwei Bytes, sodass die Zeichenanzahl nicht der Byteanzahl der Datei entsprechen muss.
UTF-16
UTF-16 kodiert Unicode mit Zwei-Byte-Einheiten, deren Bytereihenfolge bekannt sein oder durch eine führende Byte Order Mark erkannt werden muss.
Lies einen Little-Endian-Export ohne BOM mit encoding="utf-16-le" ein, wenn dieser Aufbau dokumentiert ist.

Ü

Übergeordnete Metadaten
Übergeordnete Metadaten bestehen aus Feldern, die aus einem umschließenden JSON-Objekt in jede Zeile kopiert werden, die aus seiner verschachtelten Datensatzliste entsteht.
Eine Bestellkennung, die in jede Artikelzeile kopiert wird, ermöglicht die Rückverknüpfung der Artikel mit ihrer ursprünglichen Bestellung.
Überlagerndes Schreiben im Arbeitsblatt
Überlagerndes Schreiben im Arbeitsblatt schreibt Werte in ein vorhandenes Arbeitsblatt, ohne jede alte Zelle außerhalb des neu beschriebenen Bereichs zu leeren.
Beim überlagernden Schreiben einer kürzeren Tabelle können frühere Zeilen darunter verbleiben; untersuche daher den übrigen Arbeitsblattinhalt.

V

Verbundener Zellbereich
Ein verbundener Zellbereich verbindet mehrere Tabellenkalkulationszellen visuell, während der gespeicherte Wert in der Zelle oben links bleibt.
Eine verbundene Regionsbeschriftung kann in nachfolgenden Zeilen leere Einträge hinterlassen, wenn die Tabelle in pandas eingelesen wird.

W

Windows-1252
Windows-1252 ist eine ältere Ein-Byte-Kodierung mit westlichen Buchstaben und zusätzlichen Symbolen, die sich in einem Teil ihres Bereichs von Latin-1 unterscheidet.
Das Byte für das Eurozeichen in Windows-1252 wird bei einer Interpretation als Latin-1 zu einem Steuerzeichen.

Z

Zeichenkodierung
Eine Zeichenkodierung ist eine Regel, um Zeichen als Bytes darzustellen und diese Bytes beim Einlesen als Zeichen zu interpretieren.
Derselbe Name kann beim Speichern als UTF-8 und als Windows-1252 unterschiedliche Bytefolgen belegen.
Zeichensalat
Zeichensalat ist entstellter Text, der entsteht, wenn kodierte Bytes nach der falschen Regel interpretiert werden, selbst wenn der Decoder keinen Fehler meldet.
Ein Name mit "Ã" anstelle eines Akzents deutet darauf hin, zu prüfen, ob Bytes aus UTF-8 als Windows-1252 eingelesen wurden.
Zeilengranularität
Die Zeilengranularität gibt an, was eine Tabellenzeile darstellt, und bestimmt damit, wie wiederholte Bezeichnungen und Beträge interpretiert werden sollten.
Eine Zeile pro Bestellartikel hat eine andere Zähleinheit als eine Zeile pro vollständiger Bestellung.
Zeitlimit für Anfragen
Ein Zeitlimit für Anfragen begrenzt das Warten beim Verbinden oder Lesen während einer HTTP-Anfrage, ohne eine Frist für den gesamten Download festzulegen.
Setze ein Zeitlimit, damit eine nicht antwortende Verbindung ein API-Sammelskript nicht unbegrenzt warten lässt.
Zwischengespeichertes Formelergebnis
Ein zwischengespeichertes Formelergebnis ist der neben einer Tabellenkalkulationsformel gespeicherte Wert, den eine Lesefunktion verwenden kann, ohne die Formel erneut zu berechnen.
Eine per Skript erzeugte Arbeitsmappe kann fehlende Formeldaten anzeigen, weil kein aktuelles Ergebnis gespeichert wurde.

Über diese Einheit

Von StudeliFehler melden

Erstelle deine eigenen Lernmaterialien

Mach aus deinen Notizen, Folien und Dokumenten Lernleitfäden, Übungsfragen, Karteikarten und 6 weitere Tools.

Jetzt starten