从缺少值的文本文件中读取数据

时间:2012-05-21 13:57:16

标签: python numpy python-2.7

我想从具有许多缺失值的文件中读取数据,如下例所示:

1,2,3,4,5
6,,,7,8
,,9,10,11

我正在使用numpy.loadtxt函数:

data = numpy.loadtxt('test.data', delimiter=',')

问题是缺少的值会破坏loadtxt(我得到一个“ValueError:无法将字符串转换为float:”,毫无疑问是因为有两个或多个连续的分隔符)。

有没有办法自动执行此操作,使用loadtxt或其他功能,或者我是否需要咬住子弹并手动解析每一行?

3 个答案:

答案 0 :(得分:13)

我可能会使用genfromtxt

>>> from numpy import genfromtxt
>>> genfromtxt("missing1.dat", delimiter=",")
array([[  1.,   2.,   3.,   4.,   5.],
       [  6.,  nan,  nan,   7.,   8.],
       [ nan,  nan,   9.,  10.,  11.]])

然后对nans做任何事情(将它们更改为某些东西,改为使用掩码等)。其中一些可以内联完成:

>>> genfromtxt("missing1.dat", delimiter=",", filling_values=99)
array([[  1.,   2.,   3.,   4.,   5.],
       [  6.,  99.,  99.,   7.,   8.],
       [ 99.,  99.,   9.,  10.,  11.]])

答案 1 :(得分:0)

为此,请注意,根据我的测试,没有检测到caracter-cells,只检测数值,所以如果你有一个包含字符串和数字的表,那么应该有其他方法。

我的例子:

upeak_names.txt:
id  name    Distance    name2   Distance2   name3   Distance3
upeak-3 NOC2L   -161    KLHL17  -1135   NOC2L   -162

>>>table= genfromtxt('upeak_names.txt', delimiter="\t")
>>>comb_table[2,]
>>>array([   nan,    nan,  -161.,    nan, -1135.,    nan,  -162.])

答案 2 :(得分:0)

这是因为该函数希望返回一个 numpy数组,其中所有单元格都具有相同的类型。

如果您想要一个包含混合字符串和数字的表,则应将其读入结构化数组,您也可能想添加skip_header=1来跳过第一行,即您的情况如下:

np.genfromtxt('upeak_names.txt', delimiter="\t", dtype="S10,S10,f4,S10,f4,S10,f4", 
names=["id", "name", "Distance", "name2", "Distance2", "name3", "Distance3], skip_header=1)

另请参阅: