2014-08-27 9 views
9

Ho un file csv che contiene 130.000 righe. Dopo aver letto il file usando la funzione read_csv dei pandas, uno dei Column ("CallGuid") ha tipi di oggetti misti.l'importazione pandas read_csv fornisce il tipo misto per una colonna

ho fatto:

df = pd.read_csv("data.csv") 

Poi ho questo:

In [10]: df["CallGuid"][32767] 
Out[10]: 4129237051L  

In [11]: df["CallGuid"][32768] 
Out[11]: u'4129259051' 

Tutte le righe < = 32767 sono di tipo long e tutte le righe> 32767 sono unicode

Perché è questo?

+0

Hai controllato quella riga nel tuo csv originale? Potrebbe essere quotato o avere qualche altro problema, cosa succede se si esegue 'df = pd.read_csv (" data.csv ", skiprows = 32768)' il dtype è sbagliato? – EdChum

+0

@EdChum dopo aver inserito skiprows = 32768 Ho perso i nomi delle colonne, che erano nella riga 0, come mantenere la riga dell'intestazione? – lessthanl0l

+1

do 'skiprows = [32768]'. Hai saltato le prime 32768 righe senza '[]' – TomAugspurger

risposta

4

Come altri hanno fatto notare, i dati potrebbero essere malformati, come avere preventivi o qualcosa del genere ...

Basta provare a fare:

import pandas as pd 
import numpy as np 

df = pd.read_csv("data.csv", dtype={"CallGuid": np.int64}) 

è anche più efficiente della memoria, dal momento che i panda non lo fa devo indovinare i tipi di dati.

1

OK Ho appena sperimentato lo stesso problema, con lo stesso sintomo: df [colonna] [n] tipo di cambiata dopo n> 32767

ho davvero avuto un problema nei miei dati, ma non è affatto alla linea 32767

Trovare e modificare queste poche righe problematiche ha risolto il mio problema. sono riuscito a localizzare la linea che è stata problematica utilizzando la seguente procedura estremamente sporco:

df = pd.read_csv('data.csv',chunksize = 10000) 
i=0 
for chunk in df: 
    print "{} {}".format(i,chunk["Custom Dimension 02"].dtype) 
    i+=1 

ho corso questo e ho ottenuto:

0 int64 
1 int64 
2 int64 
3 int64 
4 int64 
5 int64 
6 object 
7 int64 
8 object 
9 int64 
10 int64 

Il che mi ha detto che c'era (almeno) un linea problematica tra 60000 e 69999 e una tra 80000 e 89999

Per localizzarli con maggiore precisione, è sufficiente prendere un chunksize più piccolo e stampare solo il numero delle righe che non hanno il tipo di dta corretto

Problemi correlati