Bagaimana cara membaca data CSV ke dalam array rekaman di NumPy?

414

Aku ingin tahu apakah ada cara langsung untuk mengimpor isi dari file CSV ke dalam array catatan, banyak cara yang R read.table(), read.delim()dan read.csv()impor keluarga data ke frame data R?

Atau apakah cara terbaik untuk menggunakan csv.reader () dan kemudian menerapkan sesuatu seperti numpy.core.records.fromrecords()?

hatmatrix
sumber

Jawaban:

646

Anda dapat menggunakan genfromtxt()metode Numpy untuk melakukannya, dengan mengatur delimiterkwarg ke koma.

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

Informasi lebih lanjut tentang fungsi ini dapat ditemukan di dokumentasi masing-masing .

Andrew
sumber
10
Bagaimana jika Anda menginginkan sesuatu dari tipe yang berbeda? Suka string dan int?
CGTheLegend
11
@CGTheLegend np.genfromtxt ('myfile.csv', delimiter = ',', dtype = Tidak Ada)
chickensoup
2
numpy.loadtxt bekerja cukup baik untuk saya juga
Yibo Yang
10
Saya mencoba ini tetapi saya hanya mendapatkan nannilai, mengapa? Juga dengan loadtxt, saya mengerti UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 155: ordinal not in range(128). Saya memiliki umlaut seperti ä dan ö dalam data input.
hhh
1
@ hhh coba tambahkan encoding="utf8"argumen. Python adalah salah satu dari sedikit perangkat lunak modern yang sering menyebabkan masalah penyandian teks, yang terasa seperti masa lalu.
kolen
187

Saya akan merekomendasikan read_csvfungsi dari pandasperpustakaan:

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

Ini memberikan panda DataFrame - memungkinkan banyak fungsi manipulasi data yang berguna yang tidak tersedia secara langsung dengan array rekaman numpy .

DataFrame adalah struktur data berlabel 2 dimensi dengan kolom dari tipe yang berpotensi berbeda. Anda dapat menganggapnya seperti spreadsheet atau tabel SQL ...


Saya juga merekomendasikan genfromtxt. Namun, karena pertanyaan meminta array rekaman , sebagai lawan dari array normal, dtype=Noneparameter perlu ditambahkan ke genfromtxtpanggilan:

Mengingat file input, myfile.csv:

1.0, 2, 3
4, 5.5, 6

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

memberikan array:

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

dan

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

memberikan array rekaman:

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

Ini memiliki keuntungan bahwa file dengan banyak tipe data (termasuk string) dapat dengan mudah diimpor .

atomh33ls
sumber
read_csv bekerja dengan koma di dalam tanda kutip. Rekomendasikan ini di genfromtxt
Viet
3
gunakan tajuk = 0 untuk melewati baris pertama dalam nilai, jika file Anda memiliki tajuk 1-baris
c-chavez
Ingatlah bahwa ini menciptakan array 2d: mis (1000, 1). np.genfromtxttidak melakukan itu: mis (1000,).
Newskooler
74

Saya mengatur waktunya

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

melawan

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

pada 4,6 juta baris dengan sekitar 70 kolom dan menemukan bahwa jalur NumPy membutuhkan waktu 2 menit 16 detik dan metode pemahaman daftar csv membutuhkan waktu 13 detik.

Saya akan merekomendasikan metode pemahaman csv-list karena kemungkinan besar bergantung pada perpustakaan yang sudah dikompilasi dan bukan penerjemah sebanyak NumPy. Saya menduga metode panda akan memiliki overhead juru bahasa yang sama.

William komp
sumber
23
Saya menguji kode yang mirip dengan ini dengan file csv yang mengandung 2,6 juta baris dan 8 kolom. numpy.recfromcsv () membutuhkan waktu sekitar 45 detik, np.asarray (daftar (csv.reader ())) membutuhkan waktu sekitar 7 detik, dan pandas.read_csv () membutuhkan waktu sekitar 2 detik (!). (File baru-baru ini dibaca dari disk dalam semua kasus, jadi sudah ada dalam cache file sistem operasi.) Saya pikir saya akan pergi dengan panda.
Matthias Fripp
5
Saya hanya memperhatikan ada beberapa catatan tentang desain parser csv cepat panda di wesmckinney.com/blog/… . Penulis memperhatikan persyaratan kecepatan dan memori dengan cukup serius. Dimungkinkan juga untuk menggunakan as_recarray = True untuk mendapatkan hasilnya secara langsung sebagai array rekaman Python daripada kerangka data panda.
Matthias Fripp
67

Anda juga dapat mencoba recfromcsv()yang bisa menebak tipe data dan mengembalikan array rekaman yang diformat dengan benar.

btel
sumber
9
Jika Anda ingin mempertahankan nama kolom / pemesanan di CSV, Anda dapat menggunakan doa berikut: numpy.recfromcsv(fname, delimiter=',', filling_values=numpy.nan, case_sensitive=True, deletechars='', replace_space=' ')Argumen kunci adalah tiga yang terakhir.
eacousineau
16

Saat saya mencoba kedua cara menggunakan NumPy dan Panda, menggunakan panda memiliki banyak keuntungan:

  • Lebih cepat
  • Lebih sedikit penggunaan CPU
  • 1/3 Penggunaan RAM dibandingkan dengan NumPy genfromtxt

Ini adalah kode pengujian saya:

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

File data:

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

Dengan NumPy dan panda di versi:

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

Anda bisa menggunakan kode ini untuk mengirim data file CSV ke dalam array:

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

Menggunakan numpy.loadtxt

Metode yang cukup sederhana. Tapi itu membutuhkan semua elemen yang mengambang (int dan sebagainya)

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

Ini cara termudah:

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

Sekarang setiap entri dalam data adalah catatan, direpresentasikan sebagai sebuah array. Jadi, Anda memiliki array 2D. Itu menghemat banyak waktu saya.

Matthew Park
sumber
Mengapa kita harus bermain-main dengan Panda, ketika alat ini memiliki fitur mengasapi yang jauh lebih sedikit?
Christopher
3

Saya mencoba ini:

import pandas as p
import numpy as n

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

Saya akan menyarankan menggunakan tabel ( pip3 install tables). Anda dapat menyimpan .csvfile Anda .h5menggunakan panda ( pip3 install pandas),

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

Anda kemudian dapat dengan mudah, dan dengan waktu yang lebih sedikit bahkan untuk sejumlah besar data, memuat data Anda dalam array NumPy .

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

# Data in NumPy format
data = data.values
Jatin Mandav
sumber
3

Ini bekerja sebagai pesona ...

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)
Nihal Sargaiya
sumber
kode harus dimasukkan dengan benar di dalam tata letak penurunan kode.
surajs1n