8

CSV に保存されたデータを処理しようとしていますが、不明な数の列 (最大約 30) に欠損値がある可能性があります。genfromtxtの引数を使用して、これらの欠損値を '0' に設定しようとしていfilling_missingます。これは、Win 7 の ActiveState ActivePython 2.7 32 ビットで実行されている numpy 1.6.2 の最小限の動作例です。

import numpy

text = "a,b,c,d\n1,2,3,4\n5,,7,8"
a = numpy.genfromtxt('test.txt',delimiter=',',names=True)
b = open('test.txt','w')
b.write(text)
b.close()
a = numpy.genfromtxt('test.txt',delimiter=',',names=True)
print "plain",a

a = numpy.genfromtxt('test.txt',delimiter=',',names=True,filling_values=0)
print "filling_values=0",a

a = numpy.genfromtxt('test.txt',delimiter=',',names=True,filling_values={1:0})
print "filling_values={1:0}",a

a = numpy.genfromtxt('test.txt',delimiter=',',names=True,filling_values={0:0})
print "filling_values={0:0}",a

a = numpy.genfromtxt('test.txt',delimiter=',',names=True,filling_values={None:0})
print "filling_values={None:0}",a

そして結果:

plain [(1.0, 2.0, 3.0, 4.0) (5.0, nan, 7.0, 8.0)]
filling_values=0 [(1.0, 2.0, 3.0, 4.0) (5.0, nan, 7.0, 8.0)]
filling_values={1:0} [(1.0, 2.0, 3.0, 4.0) (5.0, 0.0, 7.0, 8.0)]
filling_values={0:0} [(1.0, 2.0, 3.0, 4.0) (5.0, nan, 7.0, 8.0)]

Traceback (most recent call last):
  File "C:\Users\tolivo.EE\Documents\active\eng\python\sizer\testGenfromtxt.py", line 20, in <module>
    a = numpy.genfromtxt('test.txt',delimiter=',',names=True,filling_values={None:0})
  File "C:\Users\tolivo.EE\AppData\Roaming\Python\Python27\site-packages\numpy\lib\npyio.py", line 1451, in genfromtxt
    filling_values[key] = val
TypeError: list indices must be integers, not NoneType

NumPy ユーザー ガイドから、私は動作することを期待filling_values=0filling_values={None:0}ますが、代わりに動作せず、それぞれエラーをスローします。正しい列 ( filling_values={1:0}) を指定すると機能しますが、ユーザーが選択する前に不明な番号の列が大量にあるため、ユーザー ガイドのヒントのように、入力された値を自動的に設定する方法を探しています。

おそらく事前に列を数え、その間に値としてfilling_valuesに渡す辞書を作成できると思いますが、もっと良い方法はありますか?

4

1 に答える 1

8

ドキュメントからは明らかではありませんが、filling_values="0"機能します。

In [19]: !cat test.txt
a,b,c,d
1,2,3,4
5,,7,8
9,10,,12

In [20]: a = numpy.genfromtxt('test.txt', delimiter=',', names=True, filling_values="0")

In [21]: print a
[(1.0, 2.0, 3.0, 4.0) (5.0, 0.0, 7.0, 8.0) (9.0, 10.0, 0.0, 12.0)]
于 2013-02-28T21:31:07.030 に答える