web-dev-qa-db-ja.com

numpy.genfromtxtを使用して、コンマを含む文字列を含むcsvファイルを読み取る

numpy.genfromtxtでcsvファイルを読み取ろうとしていますが、一部のフィールドはコンマを含む文字列です。文字列は引用符で囲まれていますが、numpyは引用符を単一の文字列の定義として認識していません。たとえば、「t.csv」のデータの場合:

2012, "Louisville KY", 3.5
2011, "Lexington, KY", 4.0

コード

np.genfromtxt('t.csv', delimiter=',')

エラーが発生します:

ValueError:いくつかのエラーが検出されました!行2(3列ではなく4列)

私が探しているデータ構造は次のとおりです。

array([['2012', 'Louisville KY', '3.5'],
       ['2011', 'Lexington, KY', '4.0']], 
      dtype='|S13')

ドキュメントを見ても、これに対処するオプションはありません。 numpyでそれを行う方法はありますか、またはcsvモジュールでデータを読み込み、それをnumpy配列に変換するだけですか?

28
CraigO

このために pandas (科学的なpythonでデータフレーム(異種データ)を操作するためのデフォルトのライブラリになります)を使用できます。 read_csv はこれを処理できます。ドキュメントから:

quotechar:文字列

The character to used to denote the start and end of a quoted item. Quoted items 
can include the delimiter and it will be ignored.

デフォルト値は"です。例:

In [1]: import pandas as pd

In [2]: from StringIO import StringIO

In [3]: s="""year, city, value
   ...: 2012, "Louisville KY", 3.5
   ...: 2011, "Lexington, KY", 4.0"""

In [4]: pd.read_csv(StringIO(s), quotechar='"', skipinitialspace=True)
Out[4]:
   year           city  value
0  2012  Louisville KY    3.5
1  2011  Lexington, KY    4.0

ここでのコツは、skipinitialspace=Trueを使用して、コンマ区切り文字の後のスペースを処理する必要があることです。

強力なcsvリーダーとは別に、あなたが持っている異種データでpandasを使用することを強くアドバイスできます(numpyの出力例はすべて構造化配列を使用できますが、文字列です)。

20
joris

追加のコンマである_np.genfromtxt_の問題はそれを処理しません。

簡単な解決策の1つは、csv.reader()を使用してpythonの csv モジュールからファイルをリストに読み取り、必要に応じてnumpy配列にダンプすることです。

本当に_np.genfromtxt_を使用する場合は、ファイルの代わりにイテレータを使用できることに注意してください。 np.genfromtxt(my_iterator, ...)。したがって、イテレータで_csv.reader_をラップし、_np.genfromtxt_に渡すことができます。

それは次のようになります:

_import csv
import numpy as np

np.genfromtxt(("\t".join(i) for i in csv.reader(open('myfile.csv'))), delimiter="\t")
_

これは基本的に、適切なコンマのみをオンザフライでタブに置き換えます。

12
Bitwise

Numpyを使用している場合は、おそらくnumpy.ndarrayを使用したいでしょう。これにより、numpy.ndarrayが得られます。

import pandas
data = pandas.read_csv('file.csv').as_matrix()

パンダは「レキシントン、ケンタッキー州」のケースを正しく処理します

4
Michael Yurin

標準の csv module とNumpyのrecfromcsvの能力を組み合わせたより良い関数を作成します。たとえば、csvモジュールには、方言、引用符、エスケープ文字などを適切に制御およびカスタマイズできる機能があり、以下の例に追加できます。

genfromcsv_mod関数は、Microsoft Excelに表示されるものと同様の複雑なCSVファイルを読み込みます。引用符で囲まれたフィールド内にコンマが含まれている場合があります。内部的に、この関数には、各行をタブ区切り文字で書き換えるジェネレーター関数があります。

import csv
import numpy as np

def recfromcsv_mod(fname, **kwargs):
    def rewrite_csv_as_tab(fname):
        with open(fname, 'rb') as fp:
            reader = csv.reader(fp)
            for row in reader:
                yield '\t'.join(row)
    return np.recfromcsv(rewrite_csv_as_tab(fname), delimiter='\t', **kwargs)

# Use it to read a CSV file into a record array
x = recfromcsv_mod('t.csv', case_sensitive=True)
2
Mike T