2015-02-07 18 views
8

Ho un problema con la lettura CSV (o file txt) sul modulo panda Poiché la funzione di loadtxt NumPy richiede troppo tempo, ho deciso di usare i panda read_csv invece.Python Panda non leggere la prima riga del file CSV

Voglio creare una matrice numpy da file txt con quattro colonne separate da spazio e ha un numero molto elevato di righe (come, 256^3. In questo esempio, è 64^3).

Il problema è che non so perché, ma sembra che read_csv di panda salti sempre la prima riga (prima riga) del file csv (txt), risultando un dato in meno.

questo è il codice.

from __future__ import division 
import numpy as np 
import pandas as pd 
ngridx = 4 
ngridy = 4 
ngridz = 4 
size = ngridx*ngridy*ngridz 
f = np.zeros((size,4)) 
a = np.arange(size) 
f[:, 0] = np.floor_divide(a, ngridy*ngridz) 
f[:, 1] = np.fmod(np.floor_divide(a, ngridz), ngridy) 
f[:, 2] = np.fmod(a, ngridz) 
f[:, 3] = np.random.rand(size) 
print f[0] 
np.savetxt('Testarray.txt',f,fmt='%6.16f') 
g = pd.read_csv('Testarray.txt',delimiter=' ').values 
print g[0] 
print len(g[:,3]) 

f [0] eg [0] che viene visualizzato come uscita deve molto ma non, indicando che i panda è saltare la prima riga del Testarray.txt. Inoltre, la lunghezza del file caricato g è inferiore alla lunghezza dell'array f.

Ho bisogno di aiuto.

Grazie in anticipo.

+0

perché stai risparmiando in numpy e poi leggendo in panda? Potrebbe essere lento, invece convertire l'array in numpy in dataframe pandas quindi scrivere in csv. È molto più veloce. – pbu

+0

oh, è solo un esempio. Sono interessato a leggerlo non salvandolo. grazie! – Tom

risposta

18

Per default, pd.read_csv utilizza header=0 (quando il parametro names è anche non specificato) che significa che il primo (cioè 0th indicizzati) riga viene interpretata come nomi di colonna.

Se i dati non ha alcuna intestazione, quindi utilizzare

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

Per esempio,

import io 
import pandas as pd 

text = '''\ 
1 2 3 
4 5 6 
''' 

print(pd.read_csv(io.BytesIO(text), sep=' ')) 

Senza header, la prima linea, 1 2 3, imposta i nomi delle colonne:

1 2 3 
0 4 5 6 

Con header=None, la prima riga è trattata come dati:

print(pd.read_csv(io.BytesIO(text), sep=' ', header=None)) 

stampe

0 1 2 
0 1 2 3 
1 4 5 6 
+0

oh! si! ha funzionato! Era confuso, che la documentazione di pandas su read_csv diceva che l'intestazione non è nulla per impostazione predefinita, quindi ero molto confuso. dopotutto era intestazione. Grazie mille per l'aiuto! – Tom

1

Se il file non ha una riga di intestazione è necessario informare in modo Pandas utilizzando intestazione = Nessuno nella vostra chiama a pd.read_csv().

Problemi correlati