CSV verilerini NumPy'de bir kayıt dizisine nasıl okurum?


414

Ben çok şekilde, rekor diziye CSV dosyasının içeriğini almak için doğrudan bir yol olup olmadığını merak ediyorum R'ın read.table(), read.delim()ve read.csv()R'ın veri çerçevesine aile ithalat verileri?

Yoksa csv.reader () ' i kullanmanın ve sonra böyle bir şeyi uygulamanın en iyi yolu numpy.core.records.fromrecords()nedir?


Yanıtlar:


646

Bunu genfromtxt()yapmak için, delimiterkwarg değerini virgül olarak ayarlayarak Numpy'nin yöntemini kullanabilirsiniz .

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

İşlev hakkında daha fazla bilgi ilgili belgelerinde bulunabilir .


10
Farklı türde bir şey istiyorsanız ne olur? Teller ve ints gibi mi?
CGTheLegend

11
@CGTheLegend np.genfromtxt ('myfile.csv', ayırıcı = ',', dtype = Yok)
tavuk

2
numpy.loadtxt benim için de iyi çalıştı
Yibo Yang

10
Bunu denedim ama sadece nandeğer alıyorum , neden? Ayrıca loadtxt ile alıyorum UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 155: ordinal not in range(128). Giriş verilerinde ä ve ö gibi sayılar var.
18:00

1
@hhh encoding="utf8"argüman eklemeyi deneyin . Python, geçmişten gelen şeyler gibi sıklıkla metin kodlama sorunlarına neden olan birkaç modern yazılım parçasından biridir.
kolen

187

read_csvFonksiyonu pandaskütüphaneden tavsiye ederim :

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

Bu, panda DataFrame'i verir - numpy kayıt dizileriyle doğrudan kullanılamayan birçok yararlı veri işleme işlevine izin verir .

DataFrame, potansiyel olarak farklı türlerde sütunlara sahip 2 boyutlu etiketli bir veri yapısıdır. Bir elektronik tablo veya SQL tablosu gibi düşünebilirsiniz ...


Ayrıca tavsiye ederim genfromtxt. Bununla birlikte, soru normal bir dizinin aksine bir kayıt dizisi istediğinden , dtype=Noneparametrenin genfromtxtçağrıya eklenmesi gerekir :

Bir giriş dosyası verildiğinde myfile.csv:

1.0, 2, 3
4, 5.5, 6

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

bir dizi verir:

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

ve

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

bir kayıt dizisi verir:

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

Bunun avantajı, birden fazla veri türüne sahip (dizeler dahil) dosyanın kolayca içe aktarılabilmesidir .


read_csv tırnak işaretleri içinde virgülle çalışır. Bunu genfromtxt üzerinden tavsiye edin
Viet

3
Dosyanızda 1 satırlık bir başlık varsa, değerlerdeki ilk satırı atlamak için başlık = 0 kullanın
c-chavez

Bunun bir 2d dizisi oluşturduğunu unutmayın: örn (1000, 1). np.genfromtxtbunu yapmaz: örn (1000,).
Newskooler

74

Zamanladım

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

karşı

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

yaklaşık 70 sütun ile 4.6 milyon satırda ve NumPy yolunun 2 dakika 16 saniye sürdüğünü ve csv listesi anlama yönteminin 13 saniye sürdüğünü buldu.

Ben büyük olasılıkla önceden derlenmiş kütüphanelere dayanmaktadır csv listesi anlama yöntemini tavsiye ederim, NumPy kadar yorumlayıcı değil. Panda yönteminin benzer tercüman yüküne sahip olduğundan şüpheleniyorum.


23
Buna benzer kodu 2.6 milyon satır ve 8 sütun içeren bir csv dosyasıyla test ettim. numpy.recfromcsv () yaklaşık 45 saniye, np.asarray (list (csv.reader ())) yaklaşık 7 saniye ve pandas.read_csv () yaklaşık 2 saniye (!) sürdü. (Dosya son zamanlarda her durumda diskten okunmuştu, bu yüzden zaten işletim sisteminin dosya önbelleğindeydi.) Sanırım pandalarla gideceğim.
Matthias Fripp

5
Ben sadece wesmckinney.com/blog/… pandaların hızlı csv ayrıştırıcı tasarımı hakkında bazı notlar olduğunu fark ettim . Yazar hız ve bellek gereksinimlerini oldukça ciddiye alıyor. Sonucu bir panda veri çerçevesi yerine doğrudan bir Python kayıt dizisi olarak almak için as_recarray = True kullanmak da mümkündür.
Matthias Fripp

67

Ayrıca recfromcsv()hangi veri türlerini tahmin edip düzgün biçimlendirilmiş bir kayıt dizisi döndürebileceğinizi deneyebilirsiniz .


9
CSV'de sipariş / sütun adlarını korumak istiyorsanız, aşağıdaki çağrıyı kullanabilirsiniz: numpy.recfromcsv(fname, delimiter=',', filling_values=numpy.nan, case_sensitive=True, deletechars='', replace_space=' ')Temel bağımsız değişkenler son üçtür.
eacousineau

16

NumPy ve Pandaları kullanarak her iki yolu denediğim gibi, panda kullanmanın birçok avantajı var:

  • Daha hızlı
  • Daha az CPU kullanımı
  • NumPy genfromtxt ile karşılaştırıldığında 1/3 RAM kullanımı

Bu benim test kodum:

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

Veri dosyası:

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

Sürümlerde NumPy ve pandalarla:

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

5

CSV dosya verilerini bir diziye göndermek için bu kodu kullanabilirsiniz:

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

4

kullanma numpy.loadtxt

Oldukça basit bir yöntem. Ancak tüm öğelerin şamandıra olmasını gerektirir (int ve benzeri)

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

4

Bu en kolay yol:

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

Şimdi verilerdeki her girdi bir dizi olarak temsil edilen bir kayıttır. Yani bir 2D diziniz var. Bana çok zaman kazandırdı.


Bu araçlar çok daha az özellikli şişkinliğe sahip olduğunda neden Pandalar ile uğraşmak zorundayız?
Christopher

3

Bunu denedim:

import pandas as p
import numpy as n

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

3

Tabloları ( pip3 install tables) kullanmanızı öneririm . .csvDosyanızı .h5panda ( pip3 install pandas) kullanarak kaydedebilirsiniz ,

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

Daha sonra kolayca ve çok miktarda veri için bile daha az zamanla, verilerinizi bir NumPy dizisine yükleyebilirsiniz .

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

# Data in NumPy format
data = data.values

3

Bu iş bir cazibe olarak ...

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)

kodun kod işaretleme düzeninde düzgün bir şekilde girintili olması gerekir.
surajs1n
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.