NumPy genfromtxt:正确使用filling_missing

8 投票
1 回答
3149 浏览
提问于 2025-04-17 17:29

我正在处理保存为CSV格式的数据,这些数据可能在不知道的情况下有缺失值,缺失的列数可能多达30列。我想用genfromtxtfilling_missing参数把这些缺失值设置为'0'。下面是一个在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的值,但有没有更好的方法呢?

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

撰写回答