web-dev-qa-db-fra.com

Python Pandas ne lit pas la première ligne du fichier csv

J'ai un problème avec la lecture de CSV (ou fichier txt) sur pandas Parce que la fonction loadtxt de numpy prend trop de temps, j'ai décidé d'utiliser à la place pandas read_csv).

Je veux faire un tableau numpy à partir d'un fichier txt avec quatre colonnes séparées par un espace, et a un très grand nombre de lignes (comme, 256 ^ 3. Dans cet exemple, c'est 64 ^ 3).

Le problème est que je ne sais pas pourquoi mais il semble que read_csv de pandas saute toujours la première ligne (première ligne) du fichier csv (txt), ce qui donne une donnée de moins.

voici le code.

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] et g [0] qui sont affichés dans la sortie doivent correspondre, mais ce n'est pas le cas, indiquant que pandas saute la première ligne du Testarray.txt. De plus, la longueur du fichier chargé g est inférieure à la longueur du tableau f.

J'ai besoin d'aide.

Merci d'avance.

18
Tom

Par défaut, pd.read_csv les usages header=0 (lorsque le paramètre names n'est pas non plus spécifié), ce qui signifie que la première ligne (c'est-à-dire 0e indexée) est interprétée comme un nom de colonne.

Si vos données n'ont pas d'en-tête, utilisez

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

Par exemple,

import io
import sys
import pandas as pd
if sys.version_info.major == 3:
    # Python3
    StringIO = io.StringIO 
else:
    # Python2
    StringIO = io.BytesIO

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

print(pd.read_csv(StringIO(text), sep=' '))

Sans header, la première ligne, 1 2 3, définit les noms des colonnes:

   1  2  3
0  4  5  6

Avec header=None, la première ligne est traitée comme une donnée:

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

impressions

   0  1  2
0  1  2  3
1  4  5  6
40
unutbu

Si votre fichier n'a pas de ligne d'en-tête, vous devez le dire Pandas donc en utilisant header = None dans votre appel à pd.read_csv ().

1
RustProof Labs