NumPy에서 CSV 데이터를 레코드 배열로 읽는 방법은 무엇입니까?


414

나는 많은 방법으로, 기록 배열로 CSV 파일의 내용을 가져올 수있는 직접적인 방법이 있는지 궁금 개의 R read.table(), read.delim()read.csv()R의 데이터 프레임에 가족의 수입 데이터?

또는 csv.reader () 를 사용 하고 다음과 같은 것을 적용 하는 가장 좋은 방법 numpy.core.records.fromrecords()입니까?


답변:


646

kwarg를 쉼표로 genfromtxt()설정하여 Numpy의 방법을 사용할 수 있습니다 delimiter.

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

기능에 대한 자세한 내용은 해당 설명서를 참조하십시오 .


10
다른 유형의 것을 원한다면 어떻게해야합니까? 문자열과 정수처럼?
CGTheLegend

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

2
numpy.loadtxt 나도 꽤 잘 작동했습니다
Yibo Yang

10
나는 이것을 시도했지만 nan가치 만 얻는 이유는 무엇입니까? 또한 loadtxt를 사용하면을 얻습니다 UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 155: ordinal not in range(128). 입력 데이터에 ä 및 ö와 같은 움라우트가 있습니다.
hhh

1
@hhh encoding="utf8"인수를 추가하십시오 . 파이썬은 텍스트 인코딩 문제를 빈번하게 일으키는 몇 가지 최신 소프트웨어 중 하나입니다.
kolen

187

라이브러리 에서 read_csv함수를 권장합니다 pandas.

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

이것은 pandas DataFrame을 제공하여 numpy 레코드 배열에서 직접 사용할 수없는 많은 유용한 데이터 조작 기능을 허용 합니다 .

DataFrame은 잠재적으로 다른 유형의 열이있는 2 차원 레이블이 지정된 데이터 구조입니다. 스프레드 시트 또는 SQL 테이블처럼 생각할 수 있습니다 ...


나는 또한 추천 할 것이다 genfromtxt. 그러나 질문은 일반 배열과 달리 레코드 배열을 요청 하므로 dtype=None매개 변수를 genfromtxt호출에 추가해야합니다 .

입력 파일이 주어지면 myfile.csv:

1.0, 2, 3
4, 5.5, 6

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

배열을 제공합니다.

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

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

레코드 배열을 제공합니다.

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

이는 여러 데이터 유형 (문자열 포함)을 가진 파일을 쉽게 가져올 수 있다는 장점이 있습니다 .


read_csv는 따옴표 안에 쉼표와 함께 작동합니다. genfromtxt 이상 권장
Viet

3
파일은 1 행 헤더가있는 경우, 헤더 값의 첫 번째 행을 건너 뛸 0 = 사용
C-차베스

이것은 2d 배열을 만듭니다 (1000, 1). np.genfromtxt그렇게하지 않습니다 : 예 (1000,).
Newskooler

74

나는 시간을

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

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

약 70 개의 열이있는 460 만 개의 행에서 NumPy 경로가 2 분 16 초가 걸리고 csv-list 이해 방법이 13 초가 걸렸다는 것을 발견했습니다.

csv-list 이해 방법은 NumPy만큼의 인터프리터가 아닌 사전 컴파일 된 라이브러리에 의존하기 때문에 권장합니다. 나는 판다 방법이 비슷한 해석기 오버 헤드를 가질 것이라고 생각합니다.


23
260 만 개의 행과 8 개의 열이 포함 된 csv 파일을 사용하여 이와 유사한 코드를 테스트했습니다. numpy.recfromcsv ()는 약 45 초, np.asarray (list (csv.reader ()))는 약 7 초, pandas.read_csv ()는 약 2 초 (!)가 걸렸습니다. (최근에 디스크에서 파일을 읽었으므로 이미 운영 체제의 파일 캐시에있었습니다.) 팬더와 함께 갈 것입니다.
Matthias Fripp 2016 년

5
방금 wesmckinney.com/blog/… 에서 팬더의 빠른 csv 파서 디자인에 대한 메모가 있음을 알았습니다 . 저자는 속도와 메모리 요구 사항을 매우 심각하게 생각합니다. as_recarray = True를 사용하여 결과를 팬더 데이터 프레임이 아닌 Python 레코드 배열로 직접 가져올 수도 있습니다.
Matthias Fripp

67

또한 recfromcsv()데이터 형식을 추측하고 올바른 형식의 레코드 배열을 반환 할 수 있습니다.


9
CSV에서 순서 / 열 이름을 유지하려는 경우 다음 호출을 사용할 수 있습니다 numpy.recfromcsv(fname, delimiter=',', filling_values=numpy.nan, case_sensitive=True, deletechars='', replace_space=' '). 주요 인수는 마지막 세 개입니다.
eacousineau

16

NumPy와 Pandas를 사용하여 두 가지 방법을 시도했지만 팬더를 사용하면 많은 이점이 있습니다.

  • 더 빠른
  • 적은 CPU 사용량
  • NumPy genfromtxt에 비해 1/3 RAM 사용

이것은 내 테스트 코드입니다.

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

데이터 파일:

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

버전에서 NumPy 및 pandas 사용 :

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

5

이 코드를 사용하여 CSV 파일 데이터를 배열로 보낼 수 있습니다.

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

4

사용 numpy.loadtxt

아주 간단한 방법입니다. 그러나 모든 요소가 부동이어야합니다 (int 등)

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

4

가장 쉬운 방법입니다.

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

이제 데이터의 각 항목은 레코드로 배열로 표시됩니다. 따라서 2D 배열이 있습니다. 너무 많은 시간을 절약했습니다.


이러한 도구의 기능 부풀림이 훨씬 적을 때 왜 Pandas로 문제를 해결해야합니까?
크리스토퍼

3

나는 이것을 시도했다 :

import pandas as p
import numpy as n

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

3

테이블 ( pip3 install tables)을 사용하는 것이 좋습니다 . 팬더 ( ) .csv.h5사용 하여 파일을 저장할 수 있습니다 pip3 install pandas.

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

그런 다음 대량의 데이터에 대해서도 쉽고 적은 시간으로 데이터를 NumPy 배열 에로드 할 수 있습니다 .

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

# Data in NumPy format
data = data.values

3

이것은 매력으로 작동합니다 ...

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)

코드는 코드 마크 다운 레이아웃 내에서 제대로 들여 쓰기되어야합니다.
surajs1n
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.