2010-08-19 11 views
252

Me pregunto si hay una manera directa de importar el contenido de un archivo csv en una matriz de registros, de forma muy similar a como la familia R read.table(), read.delim() y read.csv() importa datos al marco de datos de R?¿Cómo leer csv en el conjunto de registros en numpy?

¿O es la mejor manera de usar csv.reader() y luego aplicar algo como numpy.core.records.fromrecords()?

+0

Posible duplicado de [¿Cómo leer y escribir archivos CSV con Python?] (Http://stackoverflow.com/questions/41585078/how -do-i-read-and-write-csv-files-with-python) –

Respuesta

397

Puede usar el método genfromtxt() de Numpy para hacerlo, estableciendo el kwarg delimiter en una coma.

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

Más información sobre la función se puede encontrar en su respectivo documentation.

+4

¿Qué pasa si quieres algo de diferentes tipos? Al igual que las cuerdas y los ints? – CGTheLegend

+4

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

+0

[numpy.loadtxt] (https://docs.scipy.org/doc/numpy/reference/generated/numpy. loadtxt.html) funcionó muy bien para mí también –

63

También puede probar recfromcsv() que puede adivinar tipos de datos y devolver una matriz de registros con el formato correcto.

+7

Si desea mantener los nombres de pedidos/columnas en el archivo CSV, puede utilizar la siguiente invocación: 'numpy.recfromcsv (fname, delimiter = ',', filling_values ​​= numpy.nan, case_sensitive = True, deletechars = '', replace_space = '') ' Los argumentos clave son los últimos tres. – eacousineau

101

recomendaría la función de la biblioteca read_csvpandas:

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

Esto da un pandas DataFrame - permitiendo 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...


Yo también lo recomendaría genfromtxt. Sin embargo, ya que la pregunta pide una record array, en contraposición a una matriz normal, el parámetro dtype=None necesita ser añadido a la genfromtxt llamada:

Dado un archivo de entrada, myfile.csv:

1.0, 2, 3 
4, 5.5, 6 

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

da una matriz :

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

y

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

da una matriz de registro:

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

Esto tiene la ventaja de que el archivo con multiple data types (including strings) can be easily imported.

+0

read_csv funciona con comas dentro de comillas. Recomiende esto sobre genfromtxt – Viet

+0

use header = 0 para omitir la primera línea en los valores, si su archivo tiene un encabezado de 1 línea –

54

I timed la

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

frente

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

en 4,6 millones de filas con cerca de 70 columnas y encontraron que el camino numpy tomó 2 16s min y el método comprensión csv-list tomó 13s.

Recomendaría el método de comprensión de csv-list, ya que lo más probable es que dependa de librerías pre compiladas y no tanto del intérprete como numpy. Sospecho que el método de los pandas tendría una sobrecarga de intérprete similar.

+13

Probé código similar a este con un archivo csv que contiene 2.6 millones de filas y 8 columnas. numpy.recfromcsv() tomó aproximadamente 45 segundos, np.asarray (list (csv.reader()) tomó aproximadamente 7 segundos, y pandas.read_csv() tomó aproximadamente 2 segundos (!). (El archivo se había leído recientemente del disco en todos los casos, por lo que ya estaba en el caché de archivos del sistema operativo). Creo que iré con los pandas. –

+3

Acabo de notar que hay algunas notas sobre el diseño del analizador rápido de csv de pandas en http://wesmckinney.com/blog/a-new-high-performance-memory-efficient-file-parser-engine-for-pandas/ . El autor toma los requisitos de velocidad y memoria bastante en serio. También es posible utilizar as_recarray = True para obtener el resultado directamente como una matriz de registro de Python en lugar de un marco de datos de pandas. –

4

Puede utilizar este código para enviar los datos del archivo CSV a una matriz

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

He intentado esto:

import pandas as p 
import numpy as n 

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

Como he intentado ambas maneras usando Numpy y pandas, utilizando pandas tiene una montón de ventajas: - más rápido - menos uso de CPU - 1/3 uso de memoria RAM en comparación con Numpy genfromtxt

Este es mi código de prueba:

$ 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 y pandas en versiones:

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

Usando numpy.loadtxt

Un método bastante simple. Pero requiere que todos los elementos son flotador (int y así sucesivamente)

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