web-dev-qa-db-fra.com

Comment lire des données CSV dans un tableau d'enregistrements dans NumPy?

Je me demande s’il existe un moyen direct d’importer le contenu d’un fichier CSV dans un tableau d’enregistrements, de la même manière que la famille read.table(), read.delim() et read.csv() de R importe des données dans le cadre de données de R?

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

349
hatmatrix

Pour ce faire, vous pouvez utiliser la méthode genfromtxt() de Numpy en définissant delimiter kwarg sur une virgule.

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

Plus d'informations sur la fonction sont disponibles sur le site documentation .

531
Andrew

Je recommanderais la fonction read_csv 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 un pandas DataFrame - permettant de nombreuses fonctions de manipulation de données utiles qui ne sont pas directement disponibles avec les tableaux numpy .

DataFrame est une structure de données étiquetée en 2 dimensions avec des colonnes de types potentiellement différents. Vous pouvez le voir comme une feuille de calcul ou une table SQL ...


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

Avec 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 record:

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

Cela présente l'avantage que les fichiers avec plusieurs types de données (y compris des chaînes) peuvent être facilement importés .

153
atomh33ls

Vous pouvez également essayer recfromcsv(), qui peut deviner les types de données et renvoyer un tableau d’enregistrements correctement formaté.

65
btel

J'ai chronométré le

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

sur 4,6 millions de lignes avec environ 70 colonnes et a constaté que le chemin NumPy prenait 2 minutes 16 secondes et que la méthode de compréhension csv-list prenait 13 secondes.

Je recommanderais la méthode de compréhension csv-list car elle repose probablement sur des bibliothèques pré-compilées et non sur l'interpréteur autant que sur NumPy. Je soupçonne que la méthode des pandas aurait des frais d'interprète similaires.

60
William komp

Comme j'ai essayé les deux méthodes avec NumPy et Pandas, l'utilisation de pandas présente de nombreux avantages:

  • Plus rapide
  • Moins d'utilisation du processeur
  • 1/3 RAM utilisation comparée à 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 dans les versions:

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

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

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

J'ai essayé ceci:

import pandas as p
import numpy as n

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

Utilisation de numpy.loadtxt

Une méthode assez simple. Mais il faut que tous les éléments soient flottants (int et ainsi de suite)

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

C'est le moyen le plus simple:

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

Désormais, chaque entrée dans les données est un enregistrement, représenté sous forme de tableau. Donc, vous avez un tableau 2D. Cela m'a sauvé beaucoup de temps.

2
Matthew Park

Je suggère d'utiliser des tables (pip3 install tables). Vous pouvez enregistrer votre fichier .csv dans .h5 à l’aide de pandas (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 une quantité de données énorme, charger vos données dans un tableau NumPy.

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

# Data in NumPy format
data = data.values
1
Jatin Mandav

Ce travail comme un 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)
0
Nihal Sargaiya