Ich frage mich, ob es eine direkte Möglichkeit gibt, den Inhalt einer CSV-Datei in ein Datensatz-Array zu importieren, ähnlich wie die Familien Rs read.table()
, read.delim()
und read.csv()
Daten in Rs importieren Datenrahmen?
Oder ist die beste Möglichkeit, csv.reader () zu verwenden und dann so etwas wie numpy.core.records.fromrecords()
anzuwenden?
Sie können dazu die Methode genfromtxt()
von Numpy verwenden, indem Sie delimiter
kwarg auf ein Komma setzen.
from numpy import genfromtxt
my_data = genfromtxt('my_file.csv', delimiter=',')
Weitere Informationen zur Funktion finden Sie unter Dokumentation .
Ich würde die read_csv
-Funktion aus der pandas
-Bibliothek empfehlen:
_import pandas as pd
df=pd.read_csv('myfile.csv', sep=',',header=None)
df.values
array([[ 1. , 2. , 3. ],
[ 4. , 5.5, 6. ]])
_
Dies ergibt ein pandas DataFrame - erlaubt viele nützliche Datenmanipulationsfunktionen, die mit numpy-Record-Arrays nicht direkt verfügbar sind .
DataFrame ist eine zweidimensional beschriftete Datenstruktur mit Spalten potenziell unterschiedlicher Typen. Sie können sich das wie eine Tabellenkalkulation oder eine SQL-Tabelle vorstellen ...
Ich würde auch genfromtxt
empfehlen. Da die Frage jedoch nach einem Datensatzarray im Gegensatz zu einem normalen Array fragt, muss der Parameter _dtype=None
_ zum genfromtxt
-Aufruf hinzugefügt werden:
Bei einer gegebenen Eingabedatei _myfile.csv
_:
_1.0, 2, 3
4, 5.5, 6
import numpy as np
np.genfromtxt('myfile.csv',delimiter=',')
_
gibt ein Array:
_array([[ 1. , 2. , 3. ],
[ 4. , 5.5, 6. ]])
_
und
_np.genfromtxt('myfile.csv',delimiter=',',dtype=None)
_
gibt ein Record Array:
_array([(1.0, 2.0, 3), (4.0, 5.5, 6)],
dtype=[('f0', '<f8'), ('f1', '<f8'), ('f2', '<i4')])
_
Dies hat den Vorteil, dass Dateien mit mehrere Datentypen (einschließlich Strings) einfach importiert werden können .
Sie können auch recfromcsv()
ausprobieren, um Datentypen zu erraten und ein ordnungsgemäß formatiertes Datensatzarray zurückzugeben.
Ich habe den
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>)
in 4,6 Millionen Zeilen mit etwa 70 Spalten wurde festgestellt, dass der NumPy-Pfad 2 Minuten und 16 Sekunden dauerte und die Methode zum Verstehen der CSV-Liste 13 Sekunden dauerte.
Ich würde die Methode zum Verstehen von CSV-Listen empfehlen, da sie höchstwahrscheinlich auf vorkompilierten Bibliotheken basiert und nicht so sehr auf dem Interpreter wie NumPy. Ich vermute, dass die pandas -Methode einen ähnlichen Interpreter-Overhead haben würde.
Da ich beide Möglichkeiten mit NumPy und Pandas ausprobiert habe, hat die Verwendung von pandas viele Vorteile:
Dies ist mein Testcode:
$ 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
Mit NumPy und pandas bei Versionen:
$ pip freeze | egrep -i 'pandas|numpy'
numpy==1.13.3
pandas==0.20.2
Mit diesem Code können Sie CSV-Dateidaten in ein Array senden:
import numpy as np
csv = np.genfromtxt('test.csv', delimiter=",")
print(csv)
Ich habe es versucht:
import pandas as p
import numpy as n
closingValue = p.read_csv("<FILENAME>", usecols=[4], dtype=float)
print(closingValue)
Dies ist der einfachste Weg:
import csv with open('testfile.csv', newline='') as csvfile: data = list(csv.reader(csvfile))
Jetzt ist jeder Dateneintrag ein Datensatz, der als Array dargestellt wird. Sie haben also ein 2D-Array. Es hat mir so viel Zeit gespart.
Verwenden Sie numpy.loadtxt
Eine ganz einfache Methode. Aber es setzt voraus, dass alle Elemente float sind (int und so weiter)
_import numpy as np
data = np.loadtxt('c:\\1.csv',delimiter=',',skiprows=0)
_
Ich würde vorschlagen, Tabellen zu verwenden (pip3 install tables
). Sie können Ihre .csv
-Datei unter .h5
mit pandas (pip3 install pandas
) speichern.
import pandas as pd
data = pd.read_csv("dataset.csv")
store = pd.HDFStore('dataset.h5')
store['mydata'] = data
store.close()
Sie können dann einfach und mit weniger Zeit auch für große Datenmengen Ihre Daten in ein NumPy-Array laden.
import pandas as pd
store = pd.HDFStore('dataset.h5')
data = store['mydata']
store.close()
# Data in NumPy format
data = data.values
Das wirkt wie ein Zauber ...
import csv
with open("data.csv", 'r') as f:
data = list(csv.reader(f, delimiter=";"))
import numpy as np
data = np.array(data, dtype=np.float)