705 Stimmen

Python Pandas Fehler beim Tokenisieren von Daten

Ich versuche, pandas zu verwenden, um eine .csv-Datei zu manipulieren, aber ich erhalte diesen Fehler:

pandas.parser.CParserError: Fehler beim Tokenisieren der Daten. C Fehler: Erwartet 2 Felder in Zeile 3, aber 12 gesehen

Ich habe versucht, die pandas-Dokumentation zu lesen, aber nichts gefunden.

Mein Code ist einfach:

path = 'GOOG Key Ratios.csv'
#print(open(path).read())
data = pd.read_csv(path)

Wie kann ich das lösen? Sollte ich das csv-Modul oder eine andere Sprache verwenden?

Die Datei stammt von Morningstar

7voto

Kareem Jeiroudi Punkte 624

Was ich bisher erkennen kann, und nachdem ich mir Ihre Datei angesehen habe, besteht das Problem darin, dass die CSV-Datei, die Sie laden möchten, mehrere Tabellen hat. Es gibt leere Zeilen oder Zeilen, die Tabellentitel enthalten. Versuchen Sie, sich diese Stackoverflow-Antwort anzusehen. Es zeigt, wie man das programmgesteuert erreichen kann.

Ein weiterer dynamischer Ansatz dafür wäre, das CSV-Modul zu verwenden, jede einzelne Zeile einzulesen und Überprüfungen / reguläre Ausdrücke durchzuführen, um zu ermitteln, ob die Zeile (Titel/Überschrift/Werte/leer) ist. Mit diesem Ansatz haben Sie einen weiteren Vorteil, dass Sie Ihre Daten in Python-Objekten nach Belieben aufteilen/anfügen/sammeln können.

Das Einfachste von allen wäre es, die Pandas-Funktion pd.read_clipboard() zu verwenden, nachdem Sie die Tabelle manuell ausgewählt und in die Zwischenablage kopiert haben, falls Sie die CSV in Excel oder ähnlichem öffnen können.

Irrelevant:

Zusätzlich, unabhängig von Ihrem Problem, aber weil niemand dies erwähnt hat: Ich hatte dasselbe Problem beim Laden einiger Datensätze wie seeds_dataset.txt von UCI. In meinem Fall trat der Fehler auf, weil einige Trennzeichen mehr Leerzeichen hatten als ein echter Tab \t. Sehen Sie sich zum Beispiel Zeile 3 im Folgenden an

14.38   14.21   0.8951  5.386   3.312   2.462   4.956   1
14.69   14.49   0.8799  5.563   3.259   3.586   5.219   1
14.11   14.1    0.8911  5.42    3.302   2.7     5       1

Verwenden Sie daher \t+ im Trennzeichenmuster anstelle von \t.

data = pd.read_csv(path, sep='\t+`, header=None)

6voto

Laurent T Punkte 216

Ich glaube, die Lösungen,

,engine='python'
, error_bad_lines = False

werden gut sein, wenn es sich um Dummy-Spalten handelt und Sie diese löschen möchten. In meinem Fall hatte die zweite Zeile tatsächlich mehr Spalten und ich wollte diese Spalten integrieren und die Anzahl der Spalten = MAX(Spalten) haben.

Bitte beachten Sie die untenstehende Lösung, die ich nirgendwo lesen konnte:

try:
    df_data = pd.read_csv(PATH, header = bl_header, sep = str_sep)
except pd.errors.ParserError as err:
    str_find = 'saw '
    int_position = int(str(err).find(str_find)) + len(str_find)
    str_nbCol = str(err)[int_position:]
    l_col = range(int(str_nbCol))
    df_data = pd.read_csv(PATH, header = bl_header, sep = str_sep, names = l_col)

6voto

Zstack Punkte 2718

Für diejenigen, die ein ähnliches Problem mit Python 3 unter Linux haben.

pandas.errors.ParserError: Fehler beim Tokenisieren der Daten. C-Fehler: Aufruf von read(nbytes) auf der Quelle ist fehlgeschlagen. Versuchen Sie engine='python'.

Versuchen Sie:

df.read_csv('file.csv', encoding='utf8', engine='python')

5voto

Sachin Punkte 772

Ich bin auf mehrere Lösungen für dieses Problem gestoßen. Viele Leute haben auch die besten Erklärungen für die Antworten gegeben. Aber für Anfänger denke ich, dass die folgenden beiden Methoden ausreichend sind :

import pandas as pd

#Methode 1

data = pd.read_csv('file1.csv', error_bad_lines=False)
#Beachten Sie, dass dadurch die beanstandeten Zeilen übersprungen werden.

#Methode 2 mit Verwendung von sep

data = pd.read_csv('file1.csv', sep='\t')

5voto

Auch wenn dies nicht für diese Frage gilt, kann dieser Fehler auch bei komprimierten Daten auftreten. Das explizite Festlegen des Werts für kwarg compression hat mein Problem gelöst.

result = pandas.read_csv(data_source, compression='gzip')

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X