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

13voto

elPastor Punkte 7360

Ich hatte dieses Problem selbst schon einige Male. Fast jedes Mal lag der Grund darin, dass die Datei, die ich öffnen wollte, von Anfang an nicht ordnungsgemäß als CSV gespeichert wurde. Und mit "ordnungsgemäß" meine ich, dass jede Zeile die gleiche Anzahl an Trennzeichen oder Spalten hatte.

In der Regel ist es passiert, weil ich die CSV-Datei in Excel geöffnet und dann falsch gespeichert habe. Obwohl die Dateierweiterung immer noch .csv war, war das reine CSV-Format verändert worden.

Jede Datei, die mit pandas to_csv gespeichert wird, wird ordnungsgemäß formatiert und sollte dieses Problem nicht haben. Aber wenn Sie sie mit einem anderen Programm öffnen, kann sich die Struktur ändern.

Hoffe, das hilft.

10voto

amran hossen Punkte 270

Fehler beim Tokenisieren von Daten. C-Fehler: Erwartete 2 Felder in Zeile 3, sah 12

Der Fehler gibt einen Hinweis zur Lösung des Problems "Erwartete 2 Felder in Zeile 3, sah 12", sah 12 bedeutet, dass die Länge der zweiten Zeile 12 und die der ersten Zeile 2 beträgt.

Wenn Sie Daten wie unten gezeigt haben, werden die meisten Daten übersprungen, wenn Sie Zeilen überspringen.

data = """1,2,3
1,2,3,4
1,2,3,4,5
1,2
1,2,3,4"""

Wenn Sie keine Zeilen überspringen möchten, führen Sie Folgendes durch:

# Zuerst ermitteln wir die maximale Spalte für alle Zeilen
with open("file_name.csv", 'r') as temp_f:
    # Anzahl der Spalten in jeder Zeile erhalten
    col_count = [ len(l.split(",")) for l in temp_f.readlines() ]

### Spaltennamen generieren (Namen werden 0, 1, 2, ..., maximale Spalten - 1 sein)
column_names = [i for i in range(max(col_count))] 

import pandas as pd
# innerhalb des Bereichs setzen Sie den maximalen Wert, den Sie in "Erwartete 4 Felder in Zeile 2, sah 8" sehen können
# hier wäre es 8
data = pd.read_csv("file_name.csv",header = None,names=column_names )

Verwenden Sie range anstelle von manuell festgelegten Namen, da dies mühsam wird, wenn Sie viele Spalten haben.

Zusätzlich können Sie die NaN-Werte mit 0 auffüllen, wenn Sie eine gleichmäßige Datenlänge benötigen. z.B. für Clustering (k-means)

new_data = data.fillna(0)

9voto

Der Datensatz, den ich verwendet habe, enthielt viele Anführungszeichen (") außerhalb der Formatierung. Ich konnte den Fehler beheben, indem ich diesen Parameter für read_csv() einbezogen habe:

quoting=3 # 3 entspricht csv.QUOTE_NONE für pandas

8voto

Bhavesh Kumar Punkte 116

Verwenden Sie das Trennzeichen im Parameter

pd.read_csv(filename, delimiter=",", encoding='utf-8')

Es wird lesen.

8voto

lotrus28 Punkte 703

Ich hatte ein ähnliches Problem beim Versuch, eine tabstoppgetrennte Tabelle mit Leerzeichen, Kommas und Anführungszeichen zu lesen:

1115794 4218 "k__Bacteria", "p__Firmicutes", "c__Bacilli", "o__Bacillales", "f__Bacillaceae", ""
1144102 3180 "k__Bacteria", "p__Firmicutes", "c__Bacilli", "o__Bacillales", "f__Bacillaceae", "g__Bacillus", ""
368444 2328 "k__Bacteria", "p__Bacteroidetes", "c__Bacteroidia", "o__Bacteroidales", "f__Bacteroidaceae", "g__Bacteroides", ""

import pandas as pd
# Derselbe Fehler für read_table
counts = pd.read_csv(path_counts, sep='\t', index_col=2, header=None, engine = 'c')

pandas.io.common.CParserError: Fehler beim Tokenisieren von Daten. C-Fehler: nicht genügend Speicher

Dies legt nahe, dass es etwas mit dem C-Analysierungs-Engine (dem Standardmotor) zu tun hat. Vielleicht ändert sich etwas, wenn Sie zu einem Python-Motor wechseln.

counts = pd.read_table(path_counts, sep='\t', index_col=2, header=None, engine='python')

Segmentation fault (core dumped)

Das ist jetzt ein anderer Fehler.
Wenn wir fortfahren und versuchen, Leerzeichen aus der Tabelle zu entfernen, ändert sich der Fehler des Python-Motors erneut:

1115794 4218 "k__Bacteria","p__Firmicutes","c__Bacilli","o__Bacillales","f__Bacillaceae",""
1144102 3180 "k__Bacteria","p__Firmicutes","c__Bacilli","o__Bacillales","f__Bacillaceae","g__Bacillus",""
368444 2328 "k__Bacteria","p__Bacteroidetes","c__Bacteroidia","o__Bacteroidales","f__Bacteroidaceae","g__Bacteroides",""

_csv.Error: '   ' erwartet nach '"'

Und es wird klar, dass pandas Probleme hatte, unsere Zeilen zu analysieren. Um eine Tabelle mit Python-Engine zu analysieren, musste ich vorher alle Leerzeichen und Anführungszeichen aus der Tabelle entfernen. Der C-Motor stürzte derweil selbst mit Kommas in den Zeilen ab.

Um zu vermeiden, eine neue Datei mit Ersetzungen zu erstellen, habe ich das gemacht, da meine Tabellen klein sind:

from io import StringIO
with open(path_counts) as f:
    input = StringIO(f.read().replace('", ""', '').replace('"', '').replace(', ', ',').replace('\0',''))
    counts = pd.read_table(input, sep='\t', index_col=2, header=None, engine='python')

tl;dr
Ändern Sie die Analyse-Engine, versuchen Sie, jegliche nicht-trennenden Anführungszeichen/Kommas/Leerzeichen in Ihren Daten zu vermeiden.

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