Pandas read_csv() in Python mit Beispiel

⚡ Intelligente Zusammenfassung

Pandas `read_csv()` wandelt eine kommagetrennte Datei, egal ob lokal oder remote, mit einem einzigen Aufruf in einen DataFrame um. In diesem Beispiel wird der UCI-Datensatz zur Volkszählung Erwachsener importiert, seine fünfzehn Spalten werden benannt und das Ergebnis mithilfe von `groupby`-Aggregationen zusammengefasst.

  • 🔘 Ein Anruf: pd.read_csv() akzeptiert einen Dateipfad, eine URLoder jedes Objekt, das eine Lesemethode bereitstellt.
  • ☑️ Spaltensteuerung: Übergeben Sie Namen zur Beschriftung der Spalten und index_col=False, um einen einfachen ganzzahligen Index beizubehalten.
  • ✅ Leerzeichen: skipinitialspace=True entfernt das Leerzeichen, das im Datensatz für Erwachsene auf jedes Komma folgt.
  • 🧪 Gruppieren und aggregieren: groupby() fasst den Frame mit Anzahl, Minimum, Maximum, Mittelwert, Median oder Standardabweichung zusammen.
  • ️ Große Dateien: Die Parameter usecols, dtype und chunksize reduzieren die Analysezeit und den Speicherbedarf bei Exporten im Gigabyte-Bereich.
  • ⚠️ Häufige Fehler: Für Probleme mit der Kodierung, fehlerhaften Zeilen und gemischten Datentypen gibt es jeweils ein dokumentiertes Argument, das diese behebt.

Pandas read_csv() mit Beispiel

CSV in Pandas importieren

Im Rahmen des TensorFlow-Tutorials werden Sie Folgendes verwenden: Datensatz für ErwachseneDiese Datei wird häufig für Klassifizierungsaufgaben verwendet. Die unten verwendete Datei ist die Rohdatendatei. adult.data Export aus dem UCI Machine Learning Repository; die Datensatzseite bietet außerdem einen gezippten Download an. ucimlrepo Paket, falls der direkte Pfad jemals nicht mehr aufgelöst werden kann.

Die Daten sind im CSV-Format gespeichert. Der Datensatz umfasst 8 kategoriale Variablen:

  • Arbeiterklasse
  • Ausbildung
  • ehelich
  • Beruf
  • Beziehung
  • Rennen
  • Sex
  • Heimatland

Und 6 stetige Variablen:

  • Alter
  • fnlwgt
  • education_num
  • Wertzuwachs
  • Kapitalverlust
  • Stunden_Woche

Zusammen mit dem Einkommen label Spalte, die die 15 Spaltennamen enthält, die Sie an Pandas im nächsten Abschnitt.

Pandas read_csv() Methode

Um einen CSV-Datensatz zu importieren, können Sie das Objekt pd.read_csv() verwenden. Die grundlegende Signatur lautet:

Pandas read_csv() Syntax

pandas.read_csv(filepath_or_buffer, sep=',', names=None, index_col=None, skipinitialspace=False)
  • Dateipfad_oder_Puffer: Weg, URLoder ein dateiähnliches Objekt, das die Daten enthält
  • sep=',': das zu verwendende Trennzeichen
  • Namen=KeineBenennen Sie die Spalten. Wenn der Datensatz zehn Spalten hat, müssen Sie zehn Spaltennamen angeben.
  • index_col=None: Welche Spalte als Zeilenindex verwendet werden soll. Übergeben Sie „False“, um einen neuen ganzzahligen Index zu erzwingen.
  • skipinitialspace=False: Leerzeichen nach dem Trennzeichen überspringen

Die vollständige Liste der Argumente finden Sie auf der offiziellen Website. pandas.read_csv() Dokumentation.

Pandas read_csv() Beispiel

Der unten stehende Codeausschnitt benennt alle 15 Spalten, verweist auf die UCI-Datei und entfernt das Leerzeichen, das in diesem speziellen Datensatz auf jedes Komma folgt.

## Import csv
import pandas as pd
## Define path data
COLUMNS = ['age','workclass', 'fnlwgt', 'education', 'education_num', 'marital',
           'occupation', 'relationship', 'race', 'sex', 'capital_gain', 'capital_loss',
           'hours_week', 'native_country', 'label']
PATH = "https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data"
df_train = pd.read_csv(PATH,
                       skipinitialspace=True,
                       names = COLUMNS,
                       index_col=False)
df_train.shape

Ausgang:

(32561, 15)

Die Struktur bestätigt 32,561 Zeilen und 15 Spalten, sodass jeder Name in COLUMNS einem Feld in der Datei zugeordnet wurde.

Wichtige Parameter der Pandas-Funktion read_csv()

Die Funktion `read_csv()` akzeptiert über fünfzig Argumente, aber eine kleine Gruppe deckt nahezu alle gängigen Importfunktionen ab. Die unten aufgeführten Standardwerte entsprechen denen der aktuellen Pandas-API-Referenz.

Parameter Standard Was sie tut,
Sept ',' Als Trennzeichen wird ein Zeichen oder ein regulärer Ausdruck verwendet. Verwenden Sie sep=';' oder sep='\t' für andere Formate.
Kopfzeile 'schließen' Zeilennummer, die die Spaltenbezeichnungen enthält. Übergeben Sie header=None, wenn die Datei keine Kopfzeile hat.
Namen nicht eingestellt Explizite Liste der Spaltenbezeichnungen. In Kombination mit header=0 kann eine vorhandene Überschrift ersetzt werden.
index_col Keine Präsentation Spalte, die als Zeilenindex verwendet werden soll. index_col=False erzwingt einen einfachen ganzzahligen Index.
usecols Keine Präsentation Teilmenge der zu ladenden Spalten, basierend auf Bezeichnung oder Position. Reduziert sowohl die Analysezeit als auch den Speicherbedarf.
dtype Keine Präsentation Datentypen pro Spalte, zum Beispiel {'age': 'int32'}. Überspringt die Typinferenz.
na_values Keine Präsentation Zusätzliche Zeichenketten, die als NaN gelesen werden sollen, wie zum Beispiel der Platzhalter '?' im Datensatz für Erwachsene.
skiprows / nrows Keine Präsentation Führende Zeilen überspringen oder nur die ersten N Datenzeilen lesen.
parse_dates Keine Präsentation Spalten, die beim Lesen in ein Datums-/Zeitformat konvertiert werden sollen, gepaart mit dem Datumsformat.
Codierung 'utf-8' Textkodierung der Datei. Verwenden Sie für ältere Exportformate „latin-1“ oder „cp1252“.
Stückgröße Keine Präsentation Gibt einen Iterator zurück, der die Datei in Blöcken von N Zeilen liefert.
on_bad_lines 'Fehler' Was tun mit fehlerhaften Zeilen: Erhöhen, warnen oder überspringen.

Zwei davon verdienen eine Erwähnung. index_col=False ist nicht dasselbe, als würde man es nicht festlegen: Es weist Pandas explizit an, die erste Spalte nicht zu erweitern, was man erreichen möchte, wenn eine Datei jede Zeile mit einem überflüssigen Trennzeichen beendet. names Überschreibt stillschweigend alles, was in der Datei deklariert ist, also pass header=0 daneben, wenn die CSV-Datei tatsächlich eine Kopfzeile enthält.

Pandas groupby()-Methode

Eine einfache Möglichkeit, die Daten anzuzeigen, bietet die `groupby`-Methode. Mit dieser Methode können Sie die Daten nach Gruppen zusammenfassen. Nachfolgend finden Sie eine Liste der mit der `groupby()`-Methode verfügbaren Aggregationen:

  • zählen: zählen
  • min: min
  • max: max
  • bedeuten: bedeuten
  • Median: Median
  • Standardabweichung: Std.
  • und weitere

Innerhalb der groupby()-Funktion geben Sie die Spalte an, nach der gruppiert werden soll, bevor Sie die Aggregation anwenden.

Werfen wir einen Blick auf eine einzelne Gruppe.ping mit dem Datensatz für Erwachsene. Sie erhalten den Mittelwert aller stetigen Variablen nach Umsatzart, d. h. über 50 oder unter 50:

df_train.groupby(['label']).mean()
Etikette Alter fnlwgt education_num Wertzuwachs Kapitalverlust Stunden_Woche
<= 50K 36.783738 190340.86517 9.595065 148.752468 53.142921 38.840210
> 50K 44.249841 188005.00000 11.611657 4006.142456 195.001530 45.473026

Das Mindestalter lässt sich nach Haushaltsart ermitteln:

df_train.groupby(['label'])['age'].min()
label
<=50K    17
>50K     19
Name: age, dtype: int64

Sie können auch nach mehreren Spalten gruppieren. So können Sie sich beispielsweise den maximalen Kapitalgewinn nach Haushaltstyp und Familienstand anzeigen lassen.

df_train.groupby(['label', 'marital'])['capital_gain'].max()
label  marital
<=50K  Divorced                 34095
       Married-AF-spouse         2653
       Married-civ-spouse       41310
       Married-spouse-absent     6849
       Never-married            34095
       Separated                 7443
       Widowed                   6849
>50K   Divorced                 99999
       Married-AF-spouse         7298
       Married-civ-spouse       99999
       Married-spouse-absent    99999
       Never-married            99999
       Separated                99999
       Widowed                  99999
Name: capital_gain, dtype: int64

Sie können nach einer Gruppierung ein Diagramm erstellen. Eine Möglichkeit hierfür ist, das gruppierte Ergebnis direkt darzustellen.

Um eine übersichtlichere Darstellung zu erzielen, wenden Sie nach `mean()` die Funktion `unstack()` an, sodass der Familienstand vom Index in die Spalten verschoben wird. Das Diagramm enthält dann zwei Gruppen, eine pro Einkommenskategorie, anstelle der vierzehn (2 * 7) Balken, die ein flacher, mehrstufiger Index erzeugen würde.

Wenn Sie ein Jupyter NotizbuchDenken Sie daran, %matplotlib inline einzufügen, sonst wird kein Plot angezeigt.

%matplotlib inline
df_plot = df_train.groupby(['label', 'marital'])['capital_gain'].mean().unstack()
df_plot

Die Darstellung dieses nicht gestapelten Frames als Balkendiagramm ergibt die untenstehende Abbildung.

Gruppiertes Balkendiagramm des durchschnittlichen Kapitalgewinns nach Einkommenskategorie und Familienstand

Wie man große CSV-Dateien mit Pandas liest

Der Datensatz für Erwachsene ist klein, aber derselbe Aufruf kann bei einem Export von mehreren Gigabyte hängen bleiben. Drei Argumente erledigen den Großteil der Arbeit.

  • usecols Es werden nur die tatsächlich benötigten Spalten geladen. Laut der Pandas-Dokumentation führt dies zu deutlich schnellerem Parsen und geringerem Speicherverbrauch.
  • dtype Pandas legt jede Spalte an einen Datentyp fest, sodass die Typinferenz übersprungen und Ganzzahlen nicht standardmäßig auf 64 Bit erweitert werden.
  • Stückgröße Gibt einen TextFileReader anstelle eines DataFrames zurück, sodass Sie Blöcke von N Zeilen durchlaufen und die Daten dabei aggregieren können.
import pandas as pd

# read only the columns you need, with explicit types
cols  = ['age', 'education', 'capital_gain', 'label']
types = {'age': 'int32', 'capital_gain': 'int32'}
df = pd.read_csv(PATH, names=COLUMNS, usecols=cols, dtype=types,
                 skipinitialspace=True, index_col=False)

# stream the file in fixed-size chunks instead of loading it whole
total = 0
for chunk in pd.read_csv(PATH, names=COLUMNS, chunksize=10000,
                         skipinitialspace=True, index_col=False):
    total = total + len(chunk)
print(total)

Zwei weitere Optionen helfen, sobald die Grundlagen geschaffen sind. engine='pyarrow' wechselt zum Multithread-fähigen Arrow-Parser, und dtype_backend='pyarrow' Das Ergebnis wird in Spalten mit Pfeilen hinterlegt. low_memory ist standardmäßig auf „True“ gesetzt, wodurch die Datei intern stückweise analysiert wird. Dies kann jedoch zu gemischten Datentypen in einer Spalte führen; legen Sie daher einen expliziten Datentyp fest, anstatt sich darauf zu verlassen.

Schließlich haben compression='infer' Das bedeutet, dass ein Pfad, der auf .gz, .zip, .bz2, .xz oder .zst endet, direkt dekomprimiert wird, sodass kein Archiv vor dem Lesen entpackt werden muss.

Häufige Fehler bei der Verwendung von Pandas read_csv() und wie man sie behebt

Die meisten Fehler bei read_csv() lassen sich auf vier Ursachen zurückführen, und für jede dieser Ursachen gibt es ein dokumentiertes Argument, das das Problem behebt.

Fehler Verursachen Fixieren
FileNotFoundError Der Pfad ist relativ zum Arbeitsverzeichnis, nicht zum Skript. Verwenden Sie einen absoluten Pfad oder bestätigen Sie die URL Das Schema ist eines der folgenden: http, ftp, s3, gs oder file.
UnicodeDecodeError Die Datei ist nicht UTF-8-kodiert, was die Standardkodierung ist. Pass encoding='latin-1′ oder den korrekten Codec, oder encoding_errors='replace'.
ParserError: Fehler beim Tokenisieren der Daten Eine Zeile enthält mehr Felder, als in der Kopfzeile angegeben sind. Pass on_bad_lines='skip' oder 'warn', oder setze das korrekte sep.
DtypeWarnung: Spalten enthalten gemischte Datentypen Bei der segmentierten Typinferenz wurden unterschiedliche Typen in einer Spalte erkannt. Legen Sie einen expliziten Datentyp fest oder setzen Sie low_memory=False.
Spalten um eins verschoben Ein nachfolgendes Trennzeichen veranlasst Pandas, das erste Feld in den Index aufzunehmen. Pass index_col=False.

Der Datensatz für Erwachsene zeigt den Fall fehlender Werte direkt: Unbekannte Einträge für Arbeitsklasse, Beruf und Geburtsland werden als Fragezeichen gespeichert und kommen daher als Zeichenkette '?' an, sofern sie nicht explizit angegeben werden.

# tolerate rows with too many fields instead of raising
df = pd.read_csv(PATH, names=COLUMNS, on_bad_lines='skip')

# read a file that is not UTF-8
df = pd.read_csv('sales.csv', encoding='latin-1')

# treat the dataset's '?' placeholder as a missing value
df = pd.read_csv(PATH, names=COLUMNS, na_values='?', skipinitialspace=True)

Häufig gestellte Fragen

Beide Funktionen verwenden denselben Parser. `read_csv()` verwendet standardmäßig ein Komma als Trennzeichen, während `read_table()` allgemein durch Trennzeichen getrennte Dateien einliest und die Angabe des Trennzeichens erfordert. Verwenden Sie `read_csv()` für durch Kommas getrennte Dateien und `read_table()` für durch Tabulatoren oder Pipes getrennte Dateien.

Rufe df.to_csv('output.csv', index=False) auf. Lass die Datei fallen.ping Der Index vermeidet beim nächsten Lesevorgang eine unbenannte erste Spalte. Fügen Sie Trennzeichen-, Kodierungs- oder Komprimierungsargumente hinzu, um die Einstellungen zu übernehmen, die Sie beim Importieren der Datei verwendet haben.

Übergeben Sie `parse_dates` die Spaltennamen oder -positionen und fügen Sie `date_format` hinzu, wenn das Layout nicht ISO 8601 entspricht, z. B. `date_format='%d/%m/%Y'`. Andernfalls werden Datumsspalten als einfache Objektzeichenfolgen empfangen und erfordern einen separaten Aufruf von `to_datetime`.

Setzen Sie sep auf das gewünschte Zeichen, z. B. sep=';' oder sep='\t'. Trennzeichen, die länger als ein Zeichen sind, werden als reguläre Ausdrücke behandelt und erzwingen die langsamere Ausführung. Python engine.sep=None ermöglicht es der Engine, das Trennzeichen aus der ersten gültigen Zeile zu ermitteln.

Mit `nrows` begrenzen Sie die Anzahl der zurückgegebenen Datenzeilen, und mit `skiprows` überspringen Sie einen Block führender Zeilen. Durch die Kombination beider Parameter können Sie seitenweise durch eine Datei lesen, beispielsweise mit `skiprows=1000000` und `nrows=999999`, um die zweite Million Zeilen zu lesen.

Ja. Die Komprimierung ist standardmäßig auf „infer“ eingestellt, sodass ein Pfad, der auf .gz, .zip, .bz2, .xz oder .zst endet, automatisch dekomprimiert wird. URLDie Verwendung von http, ftp, s3, gs oder file funktioniert alles, und storage_options übergibt die Zugangsdaten an das Remote-Backend.

Trainierte Modelle kennzeichnen wahrscheinliche Typfehler, gruppieren ähnliche Schreibweisen von Kategorien und ergänzen fehlende Werte aus den umliegenden Spalten. Dadurch beschränkt sich die manuelle Bereinigung auf die Zeilen, die durch eine regelbasierte Einstellung für na_values ​​oder dtype nicht allein gelöst werden können.

Copilot generiert schnell den Boilerplate-Code, sobald es eine Beispieldatei sieht. Betrachten Sie die Argumentliste als Entwurf, da Datentyp und Kodierung oft automatisch ermittelt werden. Überprüfen Sie jedes generierte Schlüsselwort anhand der Pandas-API-Referenz, bevor Sie den Code ausführen.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: