2013-02-28 65 views
8

我正在尝试处理保存为CSV的数据,该数据可能在未知数量的列(最多约30个)中缺失值。我试图使用genfromtxtfilling_missing参数将这些缺失值设置为'0'。下面是numpy的1.6.2 ActiveState的ActivePython的运行2.7的32位在Win 7NumPy genfromtxt:正确使用filling_missing

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,但有没有更好的方法?

+0

存在一个bug报告:http://projects.scipy.org/numpy/ticket/1722 – Holger 2013-02-28 20:56:25

+0

谢谢,我添加了评论问题上GitHub的bug跟踪系统。 https://github.com/numpy/numpy/issues/2317 – Thav 2013-02-28 23:24:43

+1

这个bug现在已经在numpy的开发版本中修复了:https://github.com/numpy/numpy/pull/4968 – 2014-08-16 10:27:41

回答

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)] 
+0

这对我很有用!我曾经看到过另一个关于missing_values参数的SO问题,据说这些引用没有帮助,所以我没有在这里尝试。 – Thav 2013-02-28 23:17:29