2010-08-19 17 views
252

Je me demande s'il existe un moyen direct d'importer le contenu d'un fichier csv dans une matrice d'enregistrement, comme la famille read.table(), read.delim() et read.csv() de R importe les données dans la trame de données de R?Comment lire csv en tableau record en numpy?

Ou est le meilleur moyen d'utiliser csv.reader() et ensuite appliquer quelque chose comme numpy.core.records.fromrecords()?

+0

double possible de [Comment puis-je lire et écrire des fichiers CSV avec Python?] (Http://stackoverflow.com/questions/41585078/how -do-je-lire-et-écrire-csv-fichiers-avec-python) –

Répondre

397

Vous pouvez utiliser la méthode genfromtxt() de Numpy pour ce faire, en définissant le delimiter kwarg sur une virgule.

from numpy import genfromtxt 
my_data = genfromtxt('my_file.csv', delimiter=',') 

Plus d'informations sur la fonction se trouve à sa documentation respective.

+4

Que faire si vous voulez quelque chose de différents types? Comme les cordes et les ints? – CGTheLegend

+4

@CGTheLegend np.genfromtxt ('myfile.csv', délimiteur = ',', dtype = None) – chickensoup

+0

[numpy.loadtxt] (https://docs.scipy.org/doc/numpy/reference/generated/numpy. loadtxt.html) a fonctionné assez bien pour moi aussi –

63

Vous pouvez également essayer recfromcsv() qui peut deviner les types de données et retourner une matrice d'enregistrement correctement formatée.

+7

Si vous souhaitez gérer les noms de colonnes/de commande dans le fichier CSV, vous pouvez utiliser l'appel suivant: 'numpy.recfromcsv (nom_fichier, délimiteur = ',', valeurs_emplacement = numpy.nan, cas_sensitif = Vrai, deletechars = '', espace_supplément = '') ' Les arguments clés sont les trois derniers. – eacousineau

101

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 une Pandas DataFrame - permettant many useful data manipulation functions which are not directly available with numpy record arrays.

DataFrame is a 2-dimensional labeled data structure with columns of potentially different types. You can think of it like a spreadsheet or SQL table...


Je recommande également genfromtxt. Cependant, étant donné que la question demande une record array, par opposition à un tableau normal, le paramètre dtype=None doit être ajouté à la genfromtxt appel:

Compte tenu d'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'enregistrements:

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 multiple data types (including strings) can be easily imported.

+0

read_csv fonctionne avec des virgules entre guillemets. Recommandez ceci sur genfromtxt – Viet

+0

Utilisez header = 0 pour sauter la première ligne des valeurs, si votre fichier a un en-tête de 1 ligne –

54

J'ai chronométré le

from numpy import genfromtxt 
genfromtxt(fname = dest_file, dtype = (<whatever options>)) 

contre

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 2 min 16s et la méthode de compréhension csv-liste a 13 ans.

Je recommanderais la méthode de compréhension csv-list car elle repose probablement sur des bibliothèques précompilées et non sur l'interpréteur autant que numpy. Je soupçonne que la méthode pandas aurait des frais généraux d'interprète similaire.

+13

J'ai testé un code similaire à ceci avec un fichier csv contenant 2,6 millions de lignes et 8 colonnes. numpy.recfromcsv() a pris environ 45 secondes, np.asarray (list (csv.reader())) a pris environ 7 secondes, et pandas.read_csv() a pris environ 2 secondes (!). (Le fichier a été récemment lu sur le disque dans tous les cas, donc il était déjà dans le cache du système d'exploitation.) Je pense que je vais aller avec les pandas. –

+3

Je viens de remarquer qu'il y a quelques notes sur la conception de l'analyseur rapide de csv de pandas à http://wesmckinney.com/blog/a-new-high-performance-memory-efficient-file-parser-engine-for-pandas/ . L'auteur prend très au sérieux les exigences de rapidité et de mémoire. Il est également possible d'utiliser as_recarray = True pour obtenir le résultat directement en tant que tableau d'enregistrement Python plutôt qu'en tant que fichier de données pandas. –

4

Vous pouvez utiliser ce code pour envoyer des données de fichier csv pour un tableau

import numpy as np 
csv = np.genfromtxt('test.csv',delimiter=",") 
print(csv) 
2

J'ai essayé ceci:

import pandas as p 
import numpy as n 

closingValue = p.read_csv("<FILENAME>", usecols=[4], dtype=float) 
print(closingValue) 
2

Comme je l'ai essayé dans les deux sens à l'aide Numpy et Pandas, en utilisant pandas géants a une beaucoup d'avantages: - plus rapide - moins l'utilisation du processeur - 1/3 utilisation de la RAM à comparer Numpy genfromtxt

Ceci est mon code de test:

$ 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') 

Datafile:

du -h ~/me/notebook/train.csv 
59M /home/hvn/me/notebook/train.csv 

Avec numpy et pandas versions:

$ pip freeze | egrep -i 'pandas|numpy' 
numpy==1.13.3 
pandas==0.20.2 
0

En utilisant numpy.loadtxt

Une méthode assez simple. Mais il exige que tous les éléments étant flotteur (int et ainsi de suite)

import numpy as np 
data = np.loadtxt('c:\\1.csv',delimiter=',',skiprows=0)