CSVデータをNumPyのレコード配列に読み込むにはどうすればよいですか?


414

私は多くの方法で、レコードの配列にCSVファイルの内容をインポートするための直接的な方法があるかどうだろうというRのread.table()read.delim()、およびread.csv()Rのデータフレームに家族の輸入データ?

または、csv.reader()を使用してから次のようなものを適用する最良の方法はnumpy.core.records.fromrecords()


回答:


646

Numpyのgenfromtxt()メソッドを使用するには、delimiterkwargをコンマに設定します。

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

関数の詳細については、それぞれのドキュメントを参照してください


10
異なるタイプのものが必要な場合はどうなりますか?文字列や整数のように?
CGTheLegend 2017年

11
@CGTheLegend np.genfromtxt( 'myfile.csv'、デリミタ= ''、DTYPE =なし)
chickensoup

2
numpy.loadtxtも私にとってはかなりうまくいきました
Yibo Yang '19

10
私はこれを試しましたがnan、値しか取得していません、なぜですか?また、loadtxtを使用すると、を取得していUnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 155: ordinal not in range(128)ます。入力データにäやöなどのウムラウトがあります。
hhh '18 / 06/18

1
@hhh encoding="utf8"引数を追加してみてください。Pythonは、テキストエンコーディングの問題を頻繁に引き起こす数少ない最新のソフトウェアの1つであり、これは過去のものとして感じられます。
kolen 2018

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ではこれをお勧めします
ベトナム

3
ファイルに1行のヘッダーがある場合、header = 0を使用して値の最初の行をスキップします
c-chavez

これにより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/…にpandasの高速csvパーサーのデザインに関するメモがあることに気づきました。著者は速度とメモリ要件をかなり真剣に考えています。as_recarray = Trueを使用して、pandasデータフレームではなくPythonレコード配列として結果を直接取得することもできます。
Matthias Fripp

67

recfromcsv()データ型を推測して適切にフォーマットされたレコード配列を返すことができるものを試すこともできます。


9
CSVで順序/列名を維持する場合は、次の呼び出しを使用できますnumpy.recfromcsv(fname, delimiter=',', filling_values=numpy.nan, case_sensitive=True, deletechars='', replace_space=' ')。キー引数は最後の3つです。
eacousineau 2013年

16

NumPyとPandasの両方を使用してみたので、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配列ができました。時間を大幅に節約できました。


これらのツールの機能が大幅に低下しているのに、なぜパンダをいじくる必要があるのでしょうか?
クリストファー

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.