2010-08-19 17 views
252

Mi chiedo se esiste un modo diretto per importare il contenuto di un file csv in un array di record, molto nel modo in cui la famiglia R read.table(), read.delim() e read.csv() importa i dati nel frame di dati di R?Come leggere csv nell'array di record in numpy?

Oppure è il modo migliore per utilizzare csv.reader() e quindi applicare qualcosa come numpy.core.records.fromrecords()?

+0

Eventuali duplicati di [Come faccio a leggere e scrivere file CSV con Python?] (Http://stackoverflow.com/questions/41585078/how -do-i-read-and-write-csv-files-with-python) –

risposta

397

È possibile utilizzare il metodo genfromtxt() di Numpy per farlo, impostando il kwarg delimiter in una virgola.

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

Ulteriori informazioni sulla funzione può essere trovato alla rispettiva documentation.

+4

Cosa succede se vuoi qualcosa di diverso tipo? Come stringhe e intarsi? – CGTheLegend

+4

@CGTheLegend np.genfromtxt ('myfile.csv', delimiter = ',', dtype = Nessuno) – chickensoup

+0

[numpy.loadtxt] (https://docs.scipy.org/doc/numpy/reference/generated/numpy. loadtxt.html) ha funzionato abbastanza bene anche per me –

63

È inoltre possibile provare recfromcsv() che può indovinare i tipi di dati e restituire un array di record formattato correttamente.

+7

Se si desidera mantenere i nomi di ordinamento/colonna nel CSV, è possibile utilizzare la seguente invocazione: 'numpy.recfromcsv (fname, delimiter = ',', filling_values ​​= numpy.nan, case_sensitive = True, deletechars = '', replace_space = '') ' Gli argomenti chiave sono gli ultimi tre. – eacousineau

101

lo consiglio la funzione read_csv dalla libreria pandas:

import pandas as pd 
df=pd.read_csv('myfile.csv', sep=',',header=None) 
df.values 
array([[ 1. , 2. , 3. ], 
     [ 4. , 5.5, 6. ]]) 

Questo dà un panda DataFrame - permettendo 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...


consiglierei anche genfromtxt. Tuttavia, poiché la domanda chiede un record array, al contrario di una matrice normale, il parametro dtype=None deve essere aggiunto al genfromtxt chiamata:

Dato un file di input, myfile.csv:

1.0, 2, 3 
4, 5.5, 6 

import numpy as np 
np.genfromtxt('myfile.csv',delimiter=',') 

dà un array :

array([[ 1. , 2. , 3. ], 
     [ 4. , 5.5, 6. ]]) 

e

np.genfromtxt('myfile.csv',delimiter=',',dtype=None) 

dà una matrice di record:

array([(1.0, 2.0, 3), (4.0, 5.5, 6)], 
     dtype=[('f0', '<f8'), ('f1', '<f8'), ('f2', '<i4')]) 

Questo ha il vantaggio che il file con multiple data types (including strings) can be easily imported.

+0

read_csv funziona con virgole tra virgolette. Consiglia questo su genfromtxt – Viet

+0

usa header = 0 per saltare la prima riga nei valori, se il tuo file ha un'intestazione a 1 riga –

54

ho cronometrato il

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

contro

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

su 4,6 milioni di righe con circa 70 colonne e ha scoperto che il percorso NumPy preso 2 min 16 anni e il metodo di comprensione csv-list preso 13s.

Vorrei raccomandare il metodo di comprensione csv-list in quanto molto probabilmente si basa su librerie precompilate e non sull'interprete quanto su numpy. ho il sospetto che il metodo dei panda avrebbe overhead simile.

+13

ho testato codice simile a questo con un file csv contenente 2,6 milioni di righe e 8 colonne. numpy.recfromcsv() ha richiesto circa 45 secondi, np.asarray (lista (csv.reader())) ha impiegato circa 7 secondi e pandas.read_csv() ha impiegato circa 2 secondi (!). (Il file era stato letto di recente dal disco in tutti i casi, quindi era già nella cache dei file del sistema operativo.) Penso che andrò con i panda. –

+3

Ho appena notato che ci sono alcune note sul design del parser csv veloce dei panda su http://wesmckinney.com/blog/a-new-high-performance-memory-efficient-file-parser-engine-for-pandas/ . L'autore prende molto sul serio requisiti di velocità e memoria. È anche possibile usare as_recarray = True per ottenere il risultato direttamente come array di record Python piuttosto che come dataframe panda. –

4

È possibile utilizzare questo codice per inviare i dati file CSV in a un array

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

ho provato questo:

import pandas as p 
import numpy as n 

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

Come ho cercato in entrambe le direzioni utilizzando Numpy e Panda, utilizzando panda ha un sacco di vantaggi: - più veloce - minor utilizzo della CPU - 1/3 utilizzo della RAM confronta con Numpy genfromtxt

Questo è il mio codice di prova:

$ 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 

Con NumPy e panda in versioni:

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

Utilizzando numpy.loadtxt

Un metodo abbastanza semplice. Ma richiede tutti gli elementi essendo galleggiante (int e così via)

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