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() ?

292
demandé sur Peter Mortensen 2010-08-19 08:41:53

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 .

454
répondu Andrew 2012-03-02 15:05:49

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é .

126
répondu atomh33ls 2017-05-23 12:10:48

vous pouvez également essayer recfromcsv() qui peut deviner les types de données et retourner un tableau d'enregistrement correctement formaté.

64
répondu btel 2011-01-18 12:44:35

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.

56
répondu William komp 2018-07-15 08:26:48

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
6
répondu HVNSweeting 2018-07-15 08:29:04

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)
5
répondu chamzz.dot 2018-07-15 08:27:15

j'ai essayé ceci:

import pandas as p
import numpy as n

closingValue = p.read_csv("<FILENAME>", usecols=[4], dtype=float)
print(closingValue)
2
répondu muTheTechie 2017-08-12 19:45:07

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)  
1
répondu Xiaojian Chen 2018-05-24 16:42:46

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.

0
répondu Matthew Park 2018-06-13 21:00:25

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
0
répondu Jatin Mandav 2018-07-15 08:30:23