Question

Je me demande s'il y a un moyen direct d'importer le contenu d'un fichier CSV dans un tableau d'enregistrement, beaucoup de la manière que read.table() de R, read.delim(), et les importations de la famille read.csv() données à la trame de données de R?

Ou est la meilleure façon d'utiliser csv.reader () et ensuite appliquer quelque chose comme numpy.core.records.fromrecords()?

Était-ce utile?

La solution

Vous pouvez utiliser la méthode de genfromtxt() de Numpy de le faire, en réglant le kwarg de delimiter à une virgule.

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

Plus d'informations sur la fonction se trouve à sa documentation respectifs .

Autres conseils

Je recommande read_csv fonction de la bibliothèque pandas:

import pandas as pd
df=pd.read_csv('myfile.csv', sep=',',header=None)
df.values
array([[ 1. ,  2. ,  3. ],
       [ 4. ,  5.5,  6. ]])

Cela donne une dataframe - permettant de nombreuses fonctions de manipulation de données utiles qui ne sont pas directement disponibles avec des tableaux d'enregistrement numpy .

  

trame de données est une structure de données marqué deux dimensions avec des colonnes de   types potentiellement différents. Vous pouvez penser comme une feuille de calcul ou   table SQL ...


Je recommande également genfromtxt. Cependant, étant donné que la question demande un tableau enregistrement , par opposition à un tableau normal, le paramètre dtype=None doit être ajouté à l'appel genfromtxt:

Étant donné un fichier d'entrée, myfile.csv:

1.0, 2, 3
4, 5.5, 6

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

donne un tableau:

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

et

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

donne un tableau d'enregistrements:

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

Ceci a l'avantage que fichier plusieurs types de données (y compris les chaînes) peuvent être facilement importées .

Vous pouvez également essayer recfromcsv() qui peut deviner les types de données et retourner un tableau enregistrement correctement formaté.

Je Temporisé

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

contre

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

à 4,6 millions de lignes avec environ 70 colonnes et ont trouvé que le chemin NumPy a pris 2 min 16 sec et la méthode de compréhension csv-liste a pris 13 secondes.

Je recommande la méthode de compréhension csv-liste car il est le plus probable repose sur les bibliothèques compilées pré-et non l'interprète autant que NumPy. Je soupçonne que la méthode de pandas géants aurait en tête d'un interprète similaire.

Comme je l'ai essayé les deux façons en utilisant NumPy et Pandas, en utilisant pandas géants a beaucoup d'avantages:

  • Plus rapide
  • Moins d'utilisation du processeur
  • 1/3 utilisation de la RAM par rapport à NumPy genfromtxt

Ceci est mon code de test:

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

Fichier de données:

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

Avec NumPy et pandas versions:

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

Vous pouvez utiliser ce code pour envoyer des données de fichiers CSV dans un tableau:

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

J'ai essayé ceci:

import pandas as p
import numpy as n

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

Utilisation numpy.loadtxt

Une méthode assez simple. Mais il exige que tous les éléments étant flotteur (int et ainsi de suite)

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

Ceci est la meilleure façon:

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

Maintenant, chaque entrée de données est un disque, représentée comme un tableau. Vous avez donc un tableau 2D. Il m'a sauvé beaucoup de temps.

Je suggère d'utiliser des tables (pip3 install tables). Vous pouvez enregistrer votre fichier .csv à l'aide .h5 pandas géants (pip3 install pandas),

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

Vous pouvez alors facilement et avec moins de temps, même pour énorme quantité de données, charger vos données dans un array NumPy .

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

# Data in NumPy format
data = data.values

Ce travail comme 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)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top