Làm cách nào để đọc dữ liệu CSV vào một mảng bản ghi trong NumPy?


414

Tôi tự hỏi nếu có một cách trực tiếp để nhập nội dung của một tập tin CSV vào một mảng kỷ lục, nhiều trong cách mà R read.table(), read.delim()read.csv() nhập khẩu gia đình dữ liệu vào khung dữ liệu R không?

Hoặc là cách tốt nhất để sử dụng csv.reader () và sau đó áp dụng một cái gì đó như thế numpy.core.records.fromrecords()nào?


Câu trả lời:


646

Bạn có thể sử dụng genfromtxt()phương pháp của Numpy để làm như vậy, bằng cách đặt delimiterkwarg thành dấu phẩy.

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

Thông tin thêm về chức năng có thể được tìm thấy tại tài liệu tương ứng của nó .


10
Điều gì nếu bạn muốn một cái gì đó của các loại khác nhau? Giống như chuỗi và ints?
CGTheLegend

11
@CGTheLegend np.genfromtxt ( 'myfile.csv', delimiter = '', dtype = Không)
chickensoup

2
numpy.loadtxt cũng hoạt động khá tốt đối với tôi
Yibo Yang

10
Tôi đã thử điều này nhưng tôi chỉ nhận được nangiá trị, tại sao? Ngoài ra với loadtxt, tôi nhận được UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 155: ordinal not in range(128). Tôi có các ô như ä và ö trong dữ liệu đầu vào.
hhh

1
@hhh thử thêm encoding="utf8"đối số. Python là một trong số ít các phần mềm hiện đại thường xuyên gây ra sự cố mã hóa văn bản, cảm giác như những thứ từ quá khứ.
đánh cắp

187

Tôi muốn giới thiệu read_csvchức năng từ pandasthư viện:

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

Điều này mang lại cho DataFrame gấu trúc - cho phép nhiều hàm thao tác dữ liệu hữu ích không có sẵn trực tiếp với các mảng bản ghi numpy .

DataFrame là cấu trúc dữ liệu được gắn nhãn 2 chiều với các cột có khả năng khác nhau. Bạn có thể nghĩ về nó giống như một bảng tính hoặc bảng SQL ...


Tôi cũng muốn giới thiệu genfromtxt. Tuy nhiên, vì câu hỏi yêu cầu một mảng bản ghi , trái ngược với một mảng bình thường, dtype=Nonetham số cần được thêm vào genfromtxtcuộc gọi:

Đưa ra một tệp đầu vào , myfile.csv:

1.0, 2, 3
4, 5.5, 6

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

đưa ra một mảng:

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

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

đưa ra một mảng kỷ lục:

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

Điều này có lợi thế là tệp có nhiều loại dữ liệu (bao gồm cả chuỗi) có thể dễ dàng được nhập .


read_csv hoạt động với dấu phẩy bên trong dấu ngoặc kép. Đề xuất điều này qua genfromtxt
Việt Nam

3
sử dụng tiêu đề = 0 để bỏ qua dòng đầu tiên trong các giá trị, nếu tệp của bạn có tiêu đề 1 dòng
c-chavez

Hãy nhớ rằng điều này tạo ra một mảng 2d: vd (1000, 1). np.genfromtxtkhông làm điều đó: vd (1000,).
Newskooler

74

Tôi đã hẹn giờ

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

đấu với

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

trên 4,6 triệu hàng với khoảng 70 cột và thấy rằng đường dẫn NumPy mất 2 phút 16 giây và phương pháp hiểu danh sách csv mất 13 giây.

Tôi muốn giới thiệu phương pháp hiểu danh sách csv vì rất có thể nó phụ thuộc vào các thư viện được biên dịch sẵn chứ không phải trình thông dịch nhiều như NumPy. Tôi nghi ngờ phương pháp gấu trúc sẽ có chi phí phiên dịch tương tự.


23
Tôi đã kiểm tra mã tương tự như vậy với tệp csv chứa 2,6 triệu hàng và 8 cột. numpy.recfromcsv () mất khoảng 45 giây, np.asarray (list (csv.reader ())) mất khoảng 7 giây và pandas.read_csv () mất khoảng 2 giây (!). (Tệp gần đây đã được đọc từ đĩa trong mọi trường hợp, vì vậy nó đã có trong bộ đệm tệp của hệ điều hành.) Tôi nghĩ rằng tôi sẽ đi với gấu trúc.
Matthias Fripp

5
Tôi chỉ nhận thấy có một số lưu ý về thiết kế trình phân tích cú pháp csv nhanh của gấu trúc tại wesmckinney.com/blog/ . Tác giả có yêu cầu về tốc độ và bộ nhớ khá nghiêm túc. Cũng có thể sử dụng as_recarray = True để nhận kết quả trực tiếp dưới dạng mảng bản ghi Python chứ không phải là khung dữ liệu gấu trúc.
Matthias Fripp

67

Bạn cũng có thể thử recfromcsv()có thể đoán các loại dữ liệu và trả về một mảng bản ghi được định dạng đúng.


9
Nếu bạn muốn duy trì tên thứ tự / tên cột trong CSV, bạn có thể sử dụng lời gọi sau: numpy.recfromcsv(fname, delimiter=',', filling_values=numpy.nan, case_sensitive=True, deletechars='', replace_space=' ')Các đối số chính là ba đối số cuối cùng.
eacousineau

16

Khi tôi thử cả hai cách sử dụng NumPy và Pandas, sử dụng gấu trúc có rất nhiều lợi thế:

  • Nhanh hơn
  • Sử dụng CPU ít hơn
  • Sử dụng RAM 1/3 so với NumPy genfromtxt

Đây là mã kiểm tra của tôi:

$ 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

from pandas import read_csv
df = read_csv('/home/hvn/me/notebook/train.csv')

Tập tin dữ liệu:

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

Với NumPy và gấu trúc ở các phiên bản:

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

5

Bạn có thể sử dụng mã này để gửi dữ liệu tệp CSV vào một mảng:

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

4

Sử dụng numpy.loadtxt

Một phương pháp khá đơn giản. Nhưng nó đòi hỏi tất cả các yếu tố là float (int và vân vân)

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

4

Đây là cách dễ dàng nhất:

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

Bây giờ mỗi mục trong dữ liệu là một bản ghi, được biểu diễn dưới dạng một mảng. Vì vậy, bạn có một mảng 2D. Nó giúp tôi tiết kiệm rất nhiều thời gian.


Tại sao chúng ta phải xoay quanh với Pandas, khi những công cụ này có quá ít tính năng phình to?
Christopher

3

Tôi đã thử điều này:

import pandas as p
import numpy as n

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

3

Tôi sẽ đề nghị sử dụng bảng ( pip3 install tables). Bạn có thể lưu .csvtệp của mình để .h5sử dụng gấu trúc ( pip3 install pandas),

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

Sau đó, bạn có thể dễ dàng và với ít thời gian hơn ngay cả đối với lượng dữ liệu khổng lồ, tải dữ liệu của bạn trong một mảng NumPy .

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

# Data in NumPy format
data = data.values

3

Công việc này như một cơ duyên ...

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)

mã cần được thụt lề đúng cách trong bố cục đánh dấu mã của nó.
surajs1n
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.