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

43voto

computerist Punkte 782

Ihre CSV-Datei könnte eine variable Anzahl von Spalten haben und read_csv hat die Anzahl der Spalten aus den ersten Zeilen abgeleitet. Zwei Möglichkeiten, um dies in diesem Fall zu lösen:

1) Ändern Sie die CSV-Datei so, dass sie eine Dummy-Zeile mit maximaler Anzahl von Spalten enthält (und geben Sie header=[0] an)

2) Oder verwenden Sie names = list(range(0,N)), wobei N die maximale Anzahl von Spalten ist.

28voto

Robert Geiger Punkte 289

Ich hatte dieses Problem auch, aber vielleicht aus einem anderen Grund. In meiner CSV-Datei hatte ich einige abschließende Kommas, die eine zusätzliche Spalte hinzufügten, die von Pandas gelesen werden sollte. Verwenden des Folgenden funktioniert, aber es ignoriert einfach die fehlerhaften Zeilen:

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

Wenn Sie die Zeilen behalten möchten, gibt es eine Art hässlichen Hack zur Fehlerbehandlung, wie beispielsweise folgendes:

line     = []
expected = []
saw      = []     
cont     = True 

while cont == True:     
    try:
        data = pd.read_csv('file1.csv',skiprows=line)
        cont = False
    except Exception as e:    
        errortype = e.message.split('.')[0].strip()                                
        if errortype == 'Error tokenizing data':                        
           cerror      = e.message.split(':')[1].strip().replace(',','')
           nums        = [n for n in cerror.split(' ') if str.isdigit(n)]
           expected.append(int(nums[0]))
           saw.append(int(nums[2]))
           line.append(int(nums[1])-1)
         else:
           cerror      = 'Unknown'
           print 'Unknown Error - 222'

if line != []:
    # Behandeln Sie die Fehler, wie Sie möchten

Ich habe dann ein Skript geschrieben, um die Zeilen wieder in das DataFrame einzufügen, da die fehlerhaften Zeilen durch die Variable 'line' im obigen Code angezeigt werden. Dies kann alles vermieden werden, indem einfach der CSV-Reader verwendet wird. Hoffentlich können die Entwickler von Pandas es in Zukunft einfacher machen, mit dieser Situation umzugehen.

18voto

Manodhya Opallage Punkte 151

Sie können versuchen;

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

18voto

d_- Punkte 1313

Das Folgende hat bei mir funktioniert (Ich habe diese Antwort gepostet, weil ich speziell dieses Problem in einem Google Colaboratory Notebook hatte):

df = pd.read_csv("/path/foo.csv", delimiter=';', skiprows=0, low_memory=False)

15voto

Legend_Ari Punkte 321

Ich bin auf dasselbe Problem gestoßen. Die Verwendung von pd.read_table() auf derselben Quelldatei schien zu funktionieren. Ich konnte den Grund dafür nicht nachvollziehen, aber es war ein nützlicher Workaround für meinen Fall. Vielleicht kann jemand, der mehr weiß, mehr Licht darauf werfen, warum es funktioniert hat.

Bearbeiten: Ich habe festgestellt, dass dieser Fehler auftritt, wenn Sie in Ihrer Datei einige Texte haben, die nicht das gleiche Format wie die tatsächlichen Daten haben. Dies sind normalerweise Kopf- oder Fusszeileninformationen (mehr als eine Zeile, daher funktioniert skip_header nicht), die nicht durch die gleiche Anzahl von Kommas getrennt werden wie Ihre tatsächlichen Daten (bei Verwendung von read_csv). Die Verwendung von read_table verwendet ein Tabulatorzeichen als Trennzeichen, was den aktuellen Fehler des Benutzers umgehen könnte, aber andere einführen könnte.

Normalerweise umgehe ich dies, indem ich die zusätzlichen Daten in eine Datei lese und dann die read_csv() Methode verwende.

Die genaue Lösung kann je nach Ihrer tatsächlichen Datei unterschiedlich sein, aber dieser Ansatz hat in mehreren Fällen für mich funktioniert.

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