Comment puis-je lire les données CSV dans un tableau d'enregistrement dans NumPy?
je me demande s'il y a un moyen direct d'importer le contenu d'un fichier CSV dans un tableau d'enregistrement, tout comme read.table()
, read.delim()
et read.csv()
de R family importe des données dans la base de données de R?
Ou est la meilleure façon d'utiliser csv.reader() et ensuite appliquer quelque chose comme numpy.core.records.fromrecords()
?
10 réponses
vous pouvez utiliser la méthode genfromtxt()
de num Py pour le faire, en mettant le delimiter
kwarg à une virgule.
from numpy import genfromtxt
my_data = genfromtxt('my_file.csv', delimiter=',')
plus d'informations sur la fonction peuvent être trouvées à son documentation .
je recommande la fonction read_csv
de la bibliothèque pandas
:
import pandas as pd
df=pd.read_csv('myfile.csv', sep=',',header=None)
df.values
array([[ 1. , 2. , 3. ],
[ 4. , 5.5, 6. ]])
cela donne un pandas DataFrame - permettant de nombreuses fonctions de manipulation de données utiles qui ne sont pas directement disponibles avec numpy record arrays .
DataFrame est une structure de données en 2 dimensions avec des colonnes de potentiellement différents type. Vous pouvez penser à lui comme un tableur ou Table SQL...
je recommande aussi genfromtxt
. Cependant, la question demande une tableau d'enregistrements , par opposition à un tableau normal dtype=None
paramètre doit être ajouté à la genfromtxt
appel:
donne un fichier d'entrée, myfile.csv
:
1.0, 2, 3
4, 5.5, 6
import numpy as np
np.genfromtxt('myfile.csv',delimiter=',')
donne un tableau:
array([[ 1. , 2. , 3. ],
[ 4. , 5.5, 6. ]])
et
np.genfromtxt('myfile.csv',delimiter=',',dtype=None)
donne un tableau d'enregistrement:
array([(1.0, 2.0, 3), (4.0, 5.5, 6)],
dtype=[('f0', '<f8'), ('f1', '<f8'), ('f2', '<i4')])
ceci a l'avantage que le fichier avec plusieurs types de données (y compris les chaînes de caractères) peut être facilement importé .
vous pouvez également essayer recfromcsv()
qui peut deviner les types de données et retourner un tableau d'enregistrement correctement formaté.
j'ai chronométré le
from numpy import genfromtxt
genfromtxt(fname = dest_file, dtype = (<whatever options>))
versus
import csv
import numpy as np
with open(dest_file,'r') as dest_f:
data_iter = csv.reader(dest_f,
delimiter = delimiter,
quotechar = '"')
data = [data for data in data_iter]
data_array = np.asarray(data, dtype = <whatever options>)
sur 4,6 millions de lignes avec environ 70 colonnes et a constaté que le chemin NumPy a pris 2 min 16 secondes et la méthode de compréhension csv-liste a pris 13 secondes.
je recommande la méthode de compréhension csv-list car elle est très probablement basée sur des bibliothèques pré-compilées et non pas l'interpréteur autant que NumPy. Je pense que la méthode pandas aurait un interprète similaire. généraux.
comme j'ai essayé dans les deux sens en utilisant NumPy et Pandas, utiliser pandas a beaucoup d'avantages:
- plus Vite
- Moins utilisation CPU
- 1/3 utilisation de RAM par rapport à NumPy genfromtxt
C'est mon code d'essai:
$ for f in test_pandas.py test_numpy_csv.py ; do /usr/bin/time python $f; done
2.94user 0.41system 0:03.05elapsed 109%CPU (0avgtext+0avgdata 502068maxresident)k
0inputs+24outputs (0major+107147minor)pagefaults 0swaps
23.29user 0.72system 0:23.72elapsed 101%CPU (0avgtext+0avgdata 1680888maxresident)k
0inputs+0outputs (0major+416145minor)pagefaults 0swaps
test_numpy_csv.py
from numpy import genfromtxt
train = genfromtxt('/home/hvn/me/notebook/train.csv', delimiter=',')
test_pandas.py
from pandas import read_csv
df = read_csv('/home/hvn/me/notebook/train.csv')
fichier de données:
du -h ~/me/notebook/train.csv
59M /home/hvn/me/notebook/train.csv
Avec NumPy et les pandas dans les versions:
$ pip freeze | egrep -i 'pandas|numpy'
numpy==1.13.3
pandas==0.20.2
vous pouvez utiliser ce code pour envoyer des données de fichier CSV dans un tableau:
import numpy as np
csv = np.genfromtxt('test.csv', delimiter=",")
print(csv)
j'ai essayé ceci:
import pandas as p
import numpy as n
closingValue = p.read_csv("<FILENAME>", usecols=[4], dtype=float)
print(closingValue)
utilisant numpy.loadtxt
une méthode très simple. Mais il nécessite tous les éléments flottant (int et ainsi de suite)
import numpy as np
data = np.loadtxt('c:\1.csv',delimiter=',',skiprows=0)
C'est la voie la plus facile:
import csv
with open('testfile.csv', newline='') as csvfile:
data = list(csv.reader(csvfile))
maintenant chaque entrée dans data est un enregistrement, représenté comme un tableau. Donc vous avez un tableau 2D. Il m'a sauvé beaucoup de temps.
je suggère d'utiliser des tableaux ( pip3 install tables
). Vous pouvez sauvegarder votre fichier .csv
en .h5
en utilisant pandas ( pip3 install pandas
),
import pandas as pd
data = pd.read_csv("dataset.csv")
store = pd.HDFStore('dataset.h5')
store['mydata'] = data
store.close()
, Vous pouvez facilement et avec moins de temps, même pour une quantité énorme de données, charger vos données dans un tableau NumPy .
import pandas as pd
store = pd.HDFStore('dataset.h5')
data = store['mydata']
store.close()
# Data in NumPy format
data = data.values