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

2voto

Abhishek Tripathi Punkte 155

Verwenden Sie pandas.read_csv('CSVDATEINAME',header=None,sep=', ')

beim Versuch, CSV-Daten aus dem Link zu lesen

http://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data

Ich habe die Daten von der Website in meine CSV-Datei kopiert. Es gab zusätzliche Leerzeichen, also habe ich sep =', ' verwendet und es hat funktioniert :)

2voto

Adewole Adesola Punkte 179

Ich hatte einen ähnlichen Fall wie diesen und das Einstellen

train = pd.read_csv('input.csv' , encoding='latin1',engine='python') 

hat funktioniert

2voto

Scott Skiles Punkte 3268

Das Problem für mich war, dass meiner CSV-Datei intraday eine neue Spalte hinzugefügt wurde. Die akzeptierte Lösung würde nicht funktionieren, da jede zukünftige Zeile verworfen würde, wenn ich error_bad_lines=False verwenden würde.

Die Lösung in diesem Fall bestand darin, den usecols Parameter in pd.read_csv() zu verwenden. Auf diese Weise kann ich nur die Spalten angeben, die ich in die CSV einlesen möchte, und mein Python-Code bleibt gegen zukünftige Änderungen an der CSV-Datei resistent, solange eine Kopfzeile vorhanden ist (und die Spaltennamen sich nicht ändern).

usecols : list-like oder callable, optional 

Gibt eine Teilmenge der Spalten zurück. Wenn list-like, müssen alle Elemente entweder positionell sein (d.h. Ganzzahlen, die in die Dokumentspalten indiziert sind) oder
Strings, die Spaltennamen entsprechen, die entweder vom Benutzer in
Namen bereitgestellt werden oder aus der Kopfzeile(n) des Dokuments abgeleitet werden. Ein
gültiger list-like usecols-Parameter könnte [0, 1, 2] oder ['foo', 'bar',
'baz'] sein. Die Reihenfolge der Elemente wird ignoriert, sodass usecols=[0, 1] das gleiche ist wie [1,
0]. Um ein DataFrame aus Daten mit Beibehaltung der Elementreihenfolge instanziieren
verwenden Sie pd.read_csv(data, usecols=['foo', 'bar'])[['foo', 'bar']] für
Spalten in ['foo', 'bar'] Reihenfolge oder pd.read_csv(data, usecols=['foo',
'bar'])[['bar', 'foo']] für ['bar', 'foo'] Reihenfolge.

Beispiel

my_columns = ['foo', 'bar', 'bob']
df = pd.read_csv(file_path, usecols=my_columns)

Ein weiterer Vorteil ist, dass ich deutlich weniger Daten in den Speicher laden kann, wenn ich nur 3-4 Spalten einer CSV-Datei verwende, die 18-20 Spalten hat.

1voto

Brian Punkte 10362

In meinem Fall liegt es daran, dass das Format der ersten und letzten zwei Zeilen der CSV-Datei sich von dem mittleren Inhalt der Datei unterscheidet.

Also was ich mache, ist die CSV-Datei als String zu öffnen, den Inhalt des Strings zu parsen und dann read_csv zu verwenden, um ein DataFrame zu erhalten.

import io
import pandas as pd

file = open(f'{file_path}/{file_name}', 'r')
inhalt = file.read()

# Ändere den Zeilenumbruch von '\r\n' zu '\n'
zeilen = inhalt.replace('\r', '').split('\n')

# Entferne die ersten und letzten 2 Zeilen der Datei
# StringIO kann als Datei im Speicher betrachtet werden
df = pd.read_csv(StringIO("\n".join(zeilen[2:-2])), header=None)

1voto

Shubham Chauhan Punkte 119

Dies sieht hässlich aus, aber Sie werden Ihr DataFrame haben

import re
path = 'GOOG Key Ratios.csv'

try:
    data = pd.read_csv(path)
except Exception as e:
    val = re.findall('tokenizing.{1,100}\s*Expected\s*(\d{1,2})\s*',str(e),re.I)
    data = pd.read_csv(path, skiprows=int(val[0])-1)

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