Mi chiedo se c'è un modo diretto per importare il contenuto di un file CSV in un array di record, proprio nel modo in cui la famiglia R's read.table()
, read.delim()
, e read.csv()
importa dati a R's data frame?
O il modo migliore è usare csv.reader() e poi applicare qualcosa come numpy.core.records.fromrecords()
?
Puoi usare il metodo Numpy genfromtxt()
per farlo, impostando il kwarg delimitatore
a una virgola.
from numpy import genfromtxt
my_data = genfromtxt('my_file.csv', delimiter=',')
Maggiori informazioni sulla funzione possono essere trovate nella rispettiva documentazione.
Raccomanderei la funzione read_csv
della 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 DataFrame di pandas - permettendo molte utili funzioni di manipolazione dei dati che non sono direttamente disponibili con gli array di record numpy.
DataFrame è una struttura dati bidimensionale etichettata con colonne di tipi potenzialmente diversi. Potete pensarlo come un foglio di calcolo o una tabella SQL...
Raccomanderei anche genfromtxt
. Tuttavia, poiché la domanda chiede un array di record, invece di un normale array, il parametro dtype=None
deve essere aggiunto alla chiamata genfromtxt
:
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à un array 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 i file con più tipi di dati (incluse le stringhe) possono essere facilmente importati.