Frage

Ich frage mich, ob es ein direkter Weg, um den Inhalt einer CSV-Datei in einen Rekord-Array, viel in die Weise, dass R read.table(), read.delim() und read.csv() Familie importiert Daten in R-Datenrahmen zu importieren?

Oder ist der beste Weg, verwenden csv.reader () und dann so etwas wie numpy.core.records.fromrecords() anwenden?

War es hilfreich?

Lösung

Sie können Numpy der genfromtxt() Methode verwenden, so zu tun, durch den delimiter kwarg auf ein Komma zu setzen.

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

Weitere Informationen über die Funktion an seiner jeweiligen Dokumentation zu finden .

Andere Tipps

würde ich empfehlen, die read_csv Funktion aus der Bibliothek pandas:

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 eine Pandas Datenrahmen - so dass Funktionen viele nützliche Datenmanipulation, die mit numpy Datensatz-Arrays nicht direkt verfügbar sind .

  

Datenrahmen ist eine 2-dimensionale markierte Datenstruktur mit Spalten   potenziell verschiedene Typen. Sie können wie eine Tabelle darüber denken oder   SQL-Tabelle ...


Ich würde auch genfromtxt empfehlen. Da sich jedoch die Frage nach einem Datensatz Array , im Gegensatz zu einem normalen Array, muss der dtype=None Parameter den genfromtxt Aufruf hinzugefügt werden:

Da eine Eingabedatei, myfile.csv:

1.0, 2, 3
4, 5.5, 6

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

gibt einen Array:

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

und

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

gibt einen Rekord-Array:

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

Dies hat den Vorteil, dass Datei mit mehr Datentypen (einschließlich Strings) leicht importiert werden.

Sie können auch recfromcsv() versuchen, die Datentypen erraten kann und geben einen richtig Satzarray formatiert.

I timed die

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

Vergleich

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 festgestellt, dass der NumPy Weg dauerte 2 min 16 sec und die CSV-Liste Verständnis Verfahren dauerten 13 Sekunden.

würde ich die csv-Liste Verständnis Methode empfehlen, da es höchstwahrscheinlich auf vorkompilierte Bibliotheken angewiesen ist und nicht den Interpreter so viel wie NumPy. Ich vermute, dass die Pandas ähnlichen Verfahren wie Dolmetscher Kopf hat.

versucht Wie ich in beiden Richtungen mit NumPy und Pandas, mit Pandas viele Vorteile hat:

  • Schneller
  • Weniger CPU-Auslastung
  • 1/3 RAM-Auslastung zu NumPy Vergleich genfromtxt

Das 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 am Version:

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

Sie können diesen Code verwenden CSV-Datei Daten in ein Array zu senden:

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

Ich habe versucht, diese:

import pandas as p
import numpy as n

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

Mit numpy.loadtxt

Eine ganz einfache Methode. Aber es erfordert, dass alle die Elemente sind Schwimmer (int usw.)

import numpy as np 
data = np.loadtxt('c:\\1.csv',delimiter=',',skiprows=0)  

Dies ist die einfachste Art und Weise:

import csv with open('testfile.csv', newline='') as csvfile: data = list(csv.reader(csvfile))

Jetzt jeder Eintrag in den Daten ist ein Datensatz, als Array dargestellt. So haben Sie eine Array 2D. Es ersparte mir so viel Zeit.

Ich würde vorschlagen, Tabellen (pip3 install tables) verwenden. Sie können Ihre .csv Datei .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 leicht und mit weniger Zeit, auch für große Datenmengen laden Sie Ihre Daten in einem NumPy array .

import pandas as pd
store = pd.HDFStore('dataset.h5')
data = store['mydata']
store.close()

# Data in NumPy format
data = data.values

Diese Arbeit als Charme ...

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)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top