web-dev-qa-db-fra.com

Python Pandas Error tokenizing data

J'essaie d'utiliser des pandas pour manipuler un fichier .csv mais j'obtiens cette erreur:

pandas.parser.CParserError: erreur lors de la création de la statistique. Erreur C: 2 champs attendus dans la ligne 3, vu 12

J'ai essayé de lire la documentation sur les pandas, mais je n'ai rien trouvé.

Mon code est simple:

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

Comment puis-je résoudre ça? Devrais-je utiliser le module csv ou une autre langue?

Le fichier provient de Morningstar

207
abuteau

vous pouvez aussi essayer;

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

L'analyseur devient confus par l'en-tête du fichier. Il lit la première ligne et déduit le nombre de colonnes de cette ligne. Mais les deux premières lignes ne sont pas représentatives des données réelles du fichier.

Essayez-le avec data = pd.read_csv(path, skiprows=2)

29
TomAugspurger

Votre fichier CSV peut avoir un nombre variable de colonnes et read_csv déduit le nombre de colonnes des premières lignes. Deux façons de le résoudre dans ce cas:

1) Modifiez le fichier CSV pour avoir une première ligne fictive avec un nombre maximal de colonnes (et spécifiez header=[0])

2) Ou utilisez names = list(range(0,N)) où N est le nombre maximal de colonnes.

23
computerist

J'ai eu ce problème aussi mais peut-être pour une raison différente. Dans mon fichier CSV, des guillemets suivaient l’ajout d’une colonne supplémentaire que les pandas essayaient de lire. Utiliser les travaux suivants, mais ignore simplement les mauvaises lignes:

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

Si vous voulez que les lignes restent un mauvais moyen de traiter les erreurs, procédez comme suit:

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 != []:
    # Handle the errors however you want

J'ai procédé à l'écriture d'un script pour réinsérer les lignes dans le DataFrame puisque les lignes incorrectes seront données par la variable 'line' dans le code ci-dessus. Tout cela peut être évité en utilisant simplement le lecteur csv. Espérons que les développeurs de pandas pourront faciliter la gestion de cette situation à l’avenir.

15
Robert Geiger

Ceci est certainement un problème de délimiteur, car la plupart des CSV CSV sont créés en utilisant sep='/t', essayez donc de read_csv en utilisant le caractère de tabulation (\t) en utilisant le séparateur /t. alors, essayez d'ouvrir en utilisant la ligne de code suivante.

data=pd.read_csv("File_path", sep='\t')
14
Piyush S. Wanare

J'ai eu ce problème plusieurs fois moi-même. Presque à chaque fois, la raison en est que le fichier que je tentais d'ouvrir n'était pas un fichier CSV correctement enregistré. Et par "correctement", je veux dire que chaque ligne avait le même nombre de séparateurs ou de colonnes. 

Cela se produisait généralement parce que j'avais ouvert le fichier CSV dans Excel, puis que je l'avais mal enregistré. Même si l'extension de fichier était toujours .csv, le format CSV pur avait été modifié. 

Tout fichier enregistré avec pandas to_csv sera correctement formaté et ne devrait pas avoir ce problème. Mais si vous l'ouvrez avec un autre programme, cela peut changer la structure. 

J'espère que cela pourra aider. 

9
elPastor

Je suis tombé sur le même problème. Utiliser pd.read_table() sur le même fichier source semblait fonctionner. Je ne pouvais pas en comprendre la raison, mais c'était une solution de contournement utile pour mon cas. Peut-être que quelqu'un de plus informé peut expliquer plus en détail pourquoi cela a fonctionné.

Edit: J'ai constaté que cette erreur apparaissait lorsque votre fichier contenait du texte dont le format ne correspond pas à celui des données réelles. Il s'agit généralement d'informations d'en-tête ou de pied de page (plus d'une ligne, donc skip_header ne fonctionne pas) qui ne seront pas séparées par le même nombre de virgules que vos données réelles (lors de l'utilisation de read_csv). L'utilisation de read_table utilise un onglet en tant que délimiteur, ce qui pourrait contourner l'erreur actuelle de l'utilisateur mais en présenter d'autres.

Je contourne généralement cela en lisant les données supplémentaires dans un fichier, puis j'utilise la méthode read_csv ().

La solution exacte peut varier en fonction de votre fichier, mais cette approche a fonctionné pour moi dans plusieurs cas.

7
Legend_Ari

J'ai eu un problème similaire en essayant de lire un tableau délimité par des tabulations avec des espaces, des virgules et des guillemets:

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
# Same error for read_table
counts = pd.read_csv(path_counts, sep='\t', index_col=2, header=None, engine = 'c')

pandas.io.common.CParserError: Error tokenizing data. C error: out of memory

Cela dit que cela a quelque chose à voir avec le moteur d'analyse C (qui est le moteur par défaut). Peut-être que changer en python changera tout 

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

Segmentation fault (core dumped)

Maintenant, c'est une erreur différente.
Si nous essayons de supprimer des espaces de la table, l'erreur de python-engine change à nouveau:

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: '   ' expected after '"'

Et il est clair que les pandas avaient du mal à analyser nos lignes. Pour analyser une table avec un moteur python, je devais au préalable supprimer tous les espaces et les guillemets de la table. Pendant ce temps, C-engine a continué à planter, même avec des virgules dans les lignes .

Pour éviter de créer un nouveau fichier avec des remplacements, je l’ai fait, car mes tableaux sont petits:

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
Modifiez le moteur d’analyse, essayez d’éviter toute citation/virgule/espace non délimitant dans vos données.

4
lotrus28

la séquence suivante de commandes fonctionne (je perds la première ligne de la donnée -no header = None present-, mais au moins elle se charge):

df = pd.read_csv(filename, usecols=range(0, 42)) df.columns = ['YR', 'MO', 'DAY', 'HR', 'MIN', 'SEC', 'HUND', 'ERROR', 'RECTYPE', 'LANE', 'SPEED', 'CLASS', 'LENGTH', 'GVW', 'ESAL', 'W1', 'S1', 'W2', 'S2', 'W3', 'S3', 'W4', 'S4', 'W5', 'S5', 'W6', 'S6', 'W7', 'S7', 'W8', 'S8', 'W9', 'S9', 'W10', 'S10', 'W11', 'S11', 'W12', 'S12', 'W13', 'S13', 'W14']

Après ne fonctionne pas:

df = pd.read_csv(filename, names=['YR', 'MO', 'DAY', 'HR', 'MIN', 'SEC', 'HUND', 'ERROR', 'RECTYPE', 'LANE', 'SPEED', 'CLASS', 'LENGTH', 'GVW', 'ESAL', 'W1', 'S1', 'W2', 'S2', 'W3', 'S3', 'W4', 'S4', 'W5', 'S5', 'W6', 'S6', 'W7', 'S7', 'W8', 'S8', 'W9', 'S9', 'W10', 'S10', 'W11', 'S11', 'W12', 'S12', 'W13', 'S13', 'W14'], usecols=range(0, 42))

CParserError: Erreur lors de la création de jetons. Erreur C: 53 champs attendus dans la ligne 1605634, vu 54 Ne fonctionnent pas comme suit:

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

CParserError: Erreur lors de la création de jetons. Erreur C: 53 champs attendus sur la ligne 1605634, vu 54

Par conséquent, dans votre problème, vous devez passer usecols=range(0, 2)

3
kepy97

Bien que ce ne soit pas le cas pour cette question, cette erreur peut également apparaître avec des données compressées. La définition explicite de la valeur pour kwargcompression a résolu mon problème.

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

Utiliser le délimiteur en paramètre 

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

Il va lire. 

2
Bhavesh Kumar

Le jeu de données que j'ai utilisé comportait de nombreux guillemets (") non utilisés pour la mise en forme. J'ai pu corriger l'erreur en incluant ce paramètre pour read_csv():

quoting=3 # 3 correlates to csv.QUOTE_NONE for pandas
2
user3426943

Une alternative que j'ai trouvée utile pour traiter des erreurs d'analyse similaires utilise le module CSV pour réacheminer les données dans un pandas df. Par exemple:

import csv
import pandas as pd
path = 'C:/FileLocation/'
file = 'filename.csv'
f = open(path+file,'rt')
reader = csv.reader(f)

#once contents are available, I then put them in a list
csv_list = []
for l in reader:
    csv_list.append(l)
f.close()
#now pandas has no problem getting into a df
df = pd.DataFrame(csv_list)

Je trouve que le module CSV est un peu plus robuste que les fichiers séparés par des virgules mal formatés et que j'ai donc eu du succès avec cette route pour résoudre de tels problèmes.

2
bcoz

utiliser pandas.read_csv('CSVFILENAME',header=None,sep=', ')

en essayant de lire les données csv du lien 

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

J'ai copié les données du site dans mon fichier csv. Il y avait des espaces supplémentaires, donc utilisé sep = ',' et ça a marché :)

2
Abhishek

Parfois, le problème n'est pas de savoir comment utiliser python, mais avec les données brutes.
J'ai eu ce message d'erreur 

Error tokenizing data. C error: Expected 18 fields in line 72, saw 19.

Il s'est avéré que dans la description de la colonne, il y avait parfois des virgules. Cela signifie que le fichier CSV doit être nettoyé ou un autre séparateur utilisé. 

2
Kims Sifers

J'ai le même problème lorsque read_csv: ParserError: Erreur lors de la création de la mémoire des données ..__ Je viens de sauvegarder l'ancien fichier CSV dans un nouveau fichier CSV. Le problème est résolu!

1
Simin Zuo

J'ai eu un cas similaire comme celui-ci et le réglage

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

travaillé

1
Adewole Adesola

J'ai eu ce problème, où j'essayais de lire dans un fichier CSV sans transmettre de noms de colonne.

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

J'ai préalablement spécifié les noms de colonne dans une liste, puis je les ai passés dans names, et le problème a été résolu immédiatement. Si vous n'avez pas défini de noms de colonnes, vous pouvez simplement créer autant de noms d'espaces réservés que le nombre maximal de colonnes pouvant figurer dans vos données.

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

C'est ce que j'ai fait.

sep='::' a résolu mon problème: 

data=pd.read_csv('C:\\Users\\HP\\Downloads\\NPL ASSINGMENT 2 imdb_labelled\\imdb_labelled.txt',engine='python',header=None,sep='::')
1
Saurabh Tripathi

J'avais un ensemble de données avec des numéros de lignes pré existants, j'ai utilisé index_col: 

pd.read_csv('train.csv', index_col=0)
1
spicyramen

Le problème pourrait être lié au fichier. Dans mon cas, le problème a été résolu après avoir renommé le fichier. encore à comprendre la raison ..

0
SQA_LEARN

La plupart des réponses utiles sont déjà mentionnées, cependant je suggère de sauvegarder les pandas dataframes en tant que fichier de parquet. Les fichiers de parquet ne rencontrent pas ce problème et leur mémoire est efficace.

0
Bikash Joshi

Vous pouvez faire cette étape pour éviter le problème - 

train = pd.read_csv('/home/Project/output.csv' , header=None)

il suffit d'ajouter - header=None

J'espère que cela t'aides!!

0
rahul ranjan

J'ai rencontré cette erreur avec un guillemet errant. J'utilise un logiciel de cartographie qui met des guillemets autour des éléments de texte lors de l'exportation de fichiers délimités par des virgules. Le texte qui utilise des guillemets (par exemple '= pieds et "= pouces) peut être problématique. Considérez cet exemple qui indique qu'une impression de journal de puits de 5 pouces est médiocre:

UWI_key,Latitude,Longitude,Remark US42051316890000,30.4386484,-96.4330734,"poor 5""

Utiliser 5" comme raccourci pour 5 inch finit par lancer une clé à molette. Excel enlèvera simplement le guillemet supplémentaire, mais Pandas s'effondrera sans l'argument error_bad_lines=False mentionné ci-dessus.

0
Andrew Silver

J'ai eu une erreur similaire et le problème était que j'avais quelques citations échappées dans mon fichier csv et que je devais définir le paramètre escapechar de manière appropriée. 

0
jvvw

Ce qui suit a fonctionné pour moi (j'ai posté cette réponse, car j'avais précisément ce problème dans un carnet de notes Google Colaboratory):

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

J'ai rencontré cette erreur avec un guillemet errant. J'utilise un logiciel de cartographie qui met des guillemets autour des éléments de texte lors de l'exportation de fichiers délimités par des virgules. Le texte qui utilise des guillemets (par exemple '= pieds et "= pouces) peut être problématique. Considérez cet exemple qui indique qu'une impression de journal de puits de 5 pouces est médiocre:

UWI_key,Latitude,Longitude,Remark US42051316890000,30.4386484,-96.4330734,"poor 5""

Utiliser 5" comme raccourci pour 5 inch finit par lancer une clé à molette. Excel enlèvera simplement le guillemet supplémentaire, mais Pandas s'effondrera sans l'argument error_bad_lines=False mentionné ci-dessus.

Une fois que vous connaissez la nature de votre erreur, il peut être plus simple d'effectuer une recherche-remplacement à partir d'un éditeur de texte (par exemple, Sublime Text 3 ou Notepad ++) avant l'importation.

0
Andrew Silver

Le problème pour moi était qu'une nouvelle colonne avait été ajoutée à mon CSV intraday. La solution de réponse acceptée ne fonctionnerait pas comme tous la future ligne serait ignorée si j'utilisais error_bad_lines=False

Dans ce cas, la solution consistait à utiliser le paramètre usecols dans pd.read_csv(). Ainsi, je ne peux spécifier que les colonnes que j'ai besoin de lire dans le fichier CSV et mon code Python restera résistant aux modifications ultérieures du fichier CSV tant qu'une colonne d'en-tête existe (et que les noms de colonne ne changent pas). 

usecols : list-like or callable, optional 

Return a subset of the columns. If list-like, all elements must either
be positional (i.e. integer indices into the document columns) or
strings that correspond to column names provided either by the user in
names or inferred from the document header row(s). For example, a
valid list-like usecols parameter would be [0, 1, 2] or ['foo', 'bar',
'baz']. Element order is ignored, so usecols=[0, 1] is the same as [1,
0]. To instantiate a DataFrame from data with element order preserved
use pd.read_csv(data, usecols=['foo', 'bar'])[['foo', 'bar']] for
columns in ['foo', 'bar'] order or pd.read_csv(data, usecols=['foo',
'bar'])[['bar', 'foo']] for ['bar', 'foo'] order.

Exemple

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

Un autre avantage est que je peux charger beaucoup moins de données en mémoire si je n'utilise que 3 ou 4 colonnes d'un fichier CSV de 18 à 20 colonnes. 

0
Scott Skiles