Mă întreb dacă nu există o cale directă de a importa conținutul unui fișier CSV într-un record de matrice, de mult în modul în care R's citesc.tabelul()
, citi.delim ()", și " citească.csv()
familia importurile de date pentru a R's cadru de date?
Sau este cel mai bun mod de a utiliza csv.reader() și apoi se aplică ceva de genul numpy.core.înregistrări.fromrecords()
?
Puteți utiliza Numpy's genfromtxt () metoda pentru a face acest lucru, prin stabilirea
delimitator` kwarg să o virgulă.
from numpy import genfromtxt
my_data = genfromtxt('my_file.csv', delimiter=',')
Mai multe informații despre funcția poate fi găsit la ei respectiv documentația.
Mi-ar recomanda read_csv
funcția de panda
biblioteca:
import pandas as pd
df=pd.read_csv('myfile.csv', sep=',',header=None)
df.values
array([[ 1. , 2. , 3. ],
[ 4. , 5.5, 6. ]])
Acest lucru oferă un panda DataFrame - permite mai multe date utile funcții de manipulare care nu sunt disponibile direct cu numpy record tablouri.
DataFrame este un 2-dimensional etichetate structură de date cu coloane de potențial diferite tipuri. Vă puteți gândi la ea ca o foaie de calcul sau tabel SQL...
Mi-ar recomanda, de asemenea, genfromtxt
. Cu toate acestea, din moment ce întrebarea cere un înregistrare array, spre deosebire de un normal de matrice, dtype=None
parametru trebuie să fie adăugate la genfromtxt
apel:
Având un fișier de intrare, myfile.csv
:
1.0, 2, 3
4, 5.5, 6
import numpy as np
np.genfromtxt('myfile.csv',delimiter=',')
dă o matrice:
array([[ 1. , 2. , 3. ],
[ 4. , 5.5, 6. ]])
și
np.genfromtxt('myfile.csv',delimiter=',',dtype=None)
dă un record matrice:
array([(1.0, 2.0, 3), (4.0, 5.5, 6)],
dtype=[('f0', '<f8'), ('f1', '<f8'), ('f2', '<i4')])
Acest lucru are avantajul că fișierul cu mai multe tipuri de date (inclusiv siruri de caractere) poate fi cu ușurință importate.
Am temporizat
from numpy import genfromtxt
genfromtxt(fname = dest_file, dtype = (<whatever options>))
versus
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>)
pe de 4,6 milioane de rânduri, cu aproximativ 70 de coloane și a constatat că NumPy cale luat 2 min 16 sec și csv-lista de înțelegere metoda durat 13 secunde.
Mi-ar recomanda csv-lista înțelegerea metodei ca este cel mai probabil se bazează pe pre-compilate biblioteci și nu interpretul fel de mult ca NumPy. Bănuiesc panda metoda ar fi similare interpret deasupra capului.
Ca am incercat ambele moduri, folosind NumPy și Panda, folosind panda are o multime de avantaje:
Acesta este testul meu de cod:
$ 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
from numpy import genfromtxt
train = genfromtxt('/home/hvn/me/notebook/train.csv', delimiter=',')
from pandas import read_csv
df = read_csv('/home/hvn/me/notebook/train.csv')
du -h ~/me/notebook/train.csv
59M /home/hvn/me/notebook/train.csv
Cu NumPy și panda la versiuni:
$ pip freeze | egrep -i 'pandas|numpy'
numpy==1.13.3
pandas==0.20.2
Puteți utiliza acest cod pentru a trimite un fișier CSV de date într-o matrice:
import numpy as np
csv = np.genfromtxt('test.csv', delimiter=",")
print(csv)
Folosind numpy.loadtxt
O destul de simplă metodă. Dar este nevoie de toate elementele fiind float (int și așa mai departe)
import numpy as np
data = np.loadtxt('c:\\1.csv',delimiter=',',skiprows=0)
Acesta este cel mai simplu mod:
import csv cu deschis('testfile.csv', newline='') ca csvfile: date = lista(csv.cititor(csvfile))
Acum fiecare intrare în date este un record, reprezentat ca o matrice. Deci, aveți o matrice 2D. M-a salvat atât de mult timp.
Aș sugera folosind tabele (pip3 instala mese
). Puteți salva .csv
fișier .h5
folosind panda (pip3 instalați panda
),
import pandas as pd
data = pd.read_csv("dataset.csv")
store = pd.HDFStore('dataset.h5')
store['mydata'] = data
store.close()
Apoi, puteți cu ușurință, și cu mai puțin timp, chiar și pentru o cantitate mare de date, încărcați datele dumneavoastră într-un NumPy matrice.
import pandas as pd
store = pd.HDFStore('dataset.h5')
data = store['mydata']
store.close()
# Data in NumPy format
data = data.values
Acest lucru ca un farmec... `` import csv cu deschis("de date.csv", 'r') ca f: date = lista(csv.cititor(f, delimitator=";"))
import numpy ca np date = np.array(date, dtype=np.float) ``