我想从具有许多缺失值的文件中读取数据,如下例所示:
1,2,3,4,5
6,,,7,8
,,9,10,11
我正在使用numpy.loadtxt函数:
data = numpy.loadtxt('test.data', delimiter=',')
问题是缺少的值会破坏loadtxt(我得到一个“ValueError:无法将字符串转换为float:”,毫无疑问是因为有两个或多个连续的分隔符)。
有没有办法自动执行此操作,使用loadtxt或其他功能,或者我是否需要咬住子弹并手动解析每一行?
答案 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)
另请参阅: