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

1048voto

richie Punkte 15214

Sie könnten auch versuchen;

data = pd.read_csv('file1.csv', on_bad_lines='skip')

Beachten Sie, dass dadurch die fehlerhaften Zeilen übersprungen werden.

Bearbeiten

Für Pandas < 1.3.0 versuchen Sie

data = pd.read_csv("file1.csv", error_bad_lines=False)

gemäß Pandas API-Referenz.

214voto

william_grisaitis Punkte 3844

Es könnte ein Problem mit

  • den Trennzeichen in Ihren Daten
  • der ersten Zeile, wie von @TomAugspurger erwähnt

Um dies zu lösen, versuchen Sie, die sep und/oder header Argumente anzugeben, wenn Sie read_csv aufrufen. Zum Beispiel,

df = pandas.read_csv(dateipfad, sep='Trennzeichen', header=None)

In dem obigen Code definiert sep Ihr Trennzeichen und header=None sagt pandas, dass Ihre Quelldaten keine Zeile für Kopfzeilen / Spaltentitel haben. So sagt die Dokumentation: "Wenn die Datei keine Überschriftenzeile enthält, sollten Sie explizit header=None übergeben". In diesem Fall erstellt pandas automatisch Ganzzahlen-Indizes für jedes Feld {0,1,2,...}.

Laut der Dokumentation sollte das Trennzeichen-Problem nicht ein Problem sein. Die Dokumentation besagt, dass "wenn sep None ist [nicht angegeben], wird er versuchen, dies automatisch zu bestimmen." Ich hatte jedoch kein Glück damit, auch bei offensichtlichen Trennzeichen.

Eine andere Lösung könnte sein, das Trennzeichen automatisch zu erkennen

# die ersten 2 Zeilen der Datei verwenden, um den Separator zu erkennen
temp_lines = csv_datei.readline() + '\n' + csv_datei.readline()
dialect = csv.Sniffer().sniff(temp_lines, delimiters=';,')

# denken Sie daran, zum Anfang der Datei zurückzukehren, damit sie beim nächsten Lesen wieder gelesen werden kann
csv_datei.seek(0) 

df = pd.read_csv(csv_datei, sep=dialect.delimiter)

76voto

Piyush S. Wanare Punkte 4209

Dies ist definitiv ein Problem des Trennzeichens, da die meisten CSV-Dateien mit sep='/t' erstellt werden, also versuche read_csv mit dem Tabulatorzeichen (\t) als Trennzeichen /t zu verwenden. Versuche also, die Datei mit folgender Codezeile zu öffnen.

data=pd.read_csv("Dateipfad", sep='\t')

71voto

TomAugspurger Punkte 27954

Der Parser wird durch den Header der Datei verwirrt. Er liest die erste Zeile und folgert die Anzahl der Spalten aus dieser Zeile. Aber die ersten beiden Zeilen repräsentieren nicht die tatsächlichen Daten in der Datei.

Versuchen Sie es mit Daten = pd.read_csv (Pfad, skiprows = 2)

47voto

Steven Rouk Punkte 893

Ich hatte dieses Problem, als ich versuchte, ein CSV einzulesen, ohne Spaltennamen zu übergeben.

df = pd.read_csv(filename, header=None)

Ich habe die Spaltennamen zuvor in einer Liste spezifiziert und sie dann in names übergeben, und das hat das Problem sofort gelöst. Wenn Sie keine festgelegten Spaltennamen haben, können Sie einfach genauso viele Platzhalternamen erstellen, wie die maximale Anzahl von Spalten sein könnte, die in Ihren Daten enthalten sind.

col_names = ["col1", "col2", "col3", ...]
df = pd.read_csv(filename, names=col_names)

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