cargue el archivo csv para numpy y acceda a las columnas por nombre

Tengo un archivo csv con encabezados como:

Teniendo en cuenta este archivo test.csv :

 "A","B","C","D","E","F","timestamp" 611.88243,9089.5601,5133.0,864.07514,1715.37476,765.22777,1.291111964948E12 611.88243,9089.5601,5133.0,864.07514,1715.37476,765.22777,1.291113113366E12 611.88243,9089.5601,5133.0,864.07514,1715.37476,765.22777,1.291120650486E12 

Simplemente quiero cargarlo como una matriz / ndarray con 3 filas y 7 columnas y también quiero acceder a los column vectors desde un column name dado. Si uso genfromtxt (como se muestra a continuación), obtengo una ndarray con 3 filas (una por línea) y sin columnas.

 r = np.genfromtxt('test.csv',delimiter=',',dtype=None, names=True) print r print r.shape [ (611.88243, 9089.5601000000006, 5133.0, 864.07514000000003, 1715.3747599999999, 765.22776999999996, 1291111964948.0) (611.88243, 9089.5601000000006, 5133.0, 864.07514000000003, 1715.3747599999999, 765.22776999999996, 1291113113366.0) (611.88243, 9089.5601000000006, 5133.0, 864.07514000000003, 1715.3747599999999, 765.22776999999996, 1291120650486.0)] (3,) 

Puedo obtener vectores de columnas de nombres de columnas como este:

 print r['A'] [ 611.88243 611.88243 611.88243] 

Si uso load.txt , obtengo la matriz con 3 filas y 7 columnas, pero no puedo acceder a las columns usando los nombres de las column (como se muestra a continuación).

 numpy.loadtxt(open("test.csv","rb"),delimiter=",",skiprows=1) 

yo obtengo

  [ [611.88243,9089.5601,5133.0,864.07514,1715.37476,765.22777,1.291111964948E12] [611.88243,9089.5601,5133.0,864.07514,1715.37476,765.22777,1.291113113366E12] [611.88243,9089.5601,5133.0,864.07514,1715.37476,765.22777,1.291120650486E12] ] 

¿Hay algún enfoque en Python que pueda cumplir los requisitos juntos ( access columns by coluumn name like np.genfromtext and have a matrix like np.loadtxt )?

Usando solo numpy, las opciones que muestres son tus únicas opciones. Utilice un ndarray de dtype homogéneo con forma (3,7), o una matriz estructurada de dtype y forma (potencialmente) heterogénea (3,).

Si realmente desea una estructura de datos con columnas y formas etiquetadas (3,7), (y muchas otras cosas), podría usar un DataFrame de pandas :

 In [67]: import pandas as pd In [68]: df = pd.read_csv('data'); df Out[68]: ABCDEF timestamp 0 611.88243 9089.5601 5133 864.07514 1715.37476 765.22777 1.291112e+12 1 611.88243 9089.5601 5133 864.07514 1715.37476 765.22777 1.291113e+12 2 611.88243 9089.5601 5133 864.07514 1715.37476 765.22777 1.291121e+12 In [70]: df['A'] Out[70]: 0 611.88243 1 611.88243 2 611.88243 Name: A, dtype: float64 In [71]: df.shape Out[71]: (3, 7) 

Una alternativa de NumPy / Python pura sería usar un dict para asignar los nombres de columna a los índices:

 import numpy as np import csv with open(filename) as f: reader = csv.reader(f) columns = next(reader) colmap = dict(zip(columns, range(len(columns)))) arr = np.matrix(np.loadtxt(filename, delimiter=",", skiprows=1)) print(arr[:, colmap['A']]) 

rendimientos

 [[ 611.88243] [ 611.88243] [ 611.88243]] 

De esta manera, arr es una matriz NumPy, con columnas a las que se puede acceder por etiqueta usando la syntax

 arr[:, colmap[column_name]] 

Debido a que sus datos son homogéneos (todos los elementos son valores de punto flotante), puede crear una vista de los datos devueltos por genfromtxt que es una matriz 2D. Por ejemplo,

 In [42]: r = np.genfromtxt("test.csv", delimiter=',', names=True) 

Cree una matriz numpy que sea una “vista” de r . Esta es una matriz numpy regular, pero se crea utilizando los datos en r :

 In [43]: a = r.view(np.float64).reshape(len(r), -1) In [44]: a.shape Out[44]: (3, 7) In [45]: a[:, 0] Out[45]: array([ 611.88243, 611.88243, 611.88243]) In [46]: r['A'] Out[46]: array([ 611.88243, 611.88243, 611.88243]) 

r y a refieren al mismo bloque de memoria:

 In [47]: a[0, 0] = -1 In [48]: r['A'] Out[48]: array([ -1. , 611.88243, 611.88243])