wake-up-neo.com

Wie lese ich CSV-Daten in NumPy in ein Datensatz-Array?

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?

363
hatmatrix

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 .

547
Andrew

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 .

157
atomh33ls

Sie können auch recfromcsv() ausprobieren, um Datentypen zu erraten und ein ordnungsgemäß formatiertes Datensatzarray zurückzugeben.

65
btel

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.

61
William komp

Da ich beide Möglichkeiten mit NumPy und Pandas ausprobiert habe, hat die Verwendung von pandas viele Vorteile:

  • Schneller
  • Geringere CPU-Auslastung
  • 1/3 RAM Nutzung im Vergleich zu NumPy genfromtxt

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

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

Datendatei:

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
12
HVNSweeting

Mit diesem Code können Sie CSV-Dateidaten in ein Array senden:

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

Ich habe es versucht:

import pandas as p
import numpy as n

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

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.

3
Matthew Park

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)  
_
2
Xiaojian Chen

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
1
Jatin Mandav

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)
0
Nihal Sargaiya