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.
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.
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)

