534 Stimmen

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

Gibt es eine direkte Möglichkeit, den Inhalt einer CSV-Datei in ein Datensatz-Array zu importieren, so wie R's read.table() , read.delim() y read.csv() Daten in R-Datenframes importieren?

Oder sollte ich verwenden csv.reader() und dann anwenden numpy.core.records.fromrecords() ?

824voto

Andrew Punkte 12143

Utilice numpy.genfromtxt() durch Einstellung der delimiter kwarg zu einem Komma:

from numpy import genfromtxt
my_data = genfromtxt('my_file.csv', delimiter=',')

231voto

atomh33ls Punkte 25880

Ich empfehle die read_csv Funktion aus der pandas Bibliothek:

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 einen Pandas DataFrame - erlaubend viele nützliche Funktionen zur Datenmanipulation, die mit Numpy-Datensatzfeldern nicht direkt verfügbar sind .

DataFrame ist eine 2-dimensionale beschriftete Datenstruktur mit Spalten von potentiell verschiedenen Typen. Man kann es sich wie eine Tabellenkalkulation oder SQL-Tabelle...


Ich würde auch empfehlen genfromtxt . Da jedoch in der Frage nach einer Datensatz-Array im Gegensatz zu einem normalen Array, das dtype=None muss der Parameter genfromtxt anrufen:

Gegeben eine Eingabedatei, myfile.csv :

1.0, 2, 3
4, 5.5, 6

import numpy as np
np.genfromtxt('myfile.csv',delimiter=',')

ergibt ein Array:

array([[ 1. ,  2. ,  3. ],
       [ 4. ,  5.5,  6. ]])

y

np.genfromtxt('myfile.csv',delimiter=',',dtype=None)

ergibt ein Datensatz-Array:

array([(1.0, 2.0, 3), (4.0, 5.5, 6)], 
      dtype=[('f0', '<f8'), ('f1', '<f8'), ('f2', '<i4')])

Dies hat den Vorteil, dass die Datei mit mehrere Datentypen (einschließlich Strings) können leicht importiert werden .

90voto

William komp Punkte 1207

Ich habe es versucht:

from numpy import genfromtxt
genfromtxt(fname = dest_file, dtype = (<whatever options>))

gegen :

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

auf 4,6 Millionen Zeilen mit etwa 70 Spalten und stellte fest, dass der NumPy-Pfad 2 Minuten und 16 Sekunden und die csv-Listenverstehensmethode 13 Sekunden benötigte.

Ich würde die csv-Liste-Verständnis-Methode empfehlen, da es höchstwahrscheinlich auf vorkompilierte Bibliotheken und nicht der Interpreter so viel wie NumPy verlässt. Ich vermute, die Pandas-Methode würde ähnliche Interpreter-Overhead haben.

68voto

btel Punkte 5233

Sie können auch versuchen recfromcsv() die Datentypen erraten und ein korrekt formatiertes Datensatz-Array zurückgeben kann.

25voto

HVNSweeting Punkte 2661

Ich habe beide Möglichkeiten ausprobiert, NumPy und Pandas, wobei die Verwendung von Pandas eine Menge Vorteile hat:

  • Schneller
  • Weniger CPU-Nutzung
  • 1/3 RAM-Verbrauch 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')

Datei:

du -h ~/me/notebook/train.csv
 59M    /home/hvn/me/notebook/train.csv

Mit NumPy und Pandas in den Versionen:

$ pip freeze | egrep -i 'pandas|numpy'
numpy==1.13.3
pandas==0.20.2

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X