尽管有以前问题的建议:
-9999 as missing value with numpy.genfromtxt()
Using genfromtxt to import csv data with missing values in numpy
我仍然无法处理以缺失值结尾的文本文件
A.TXT:
1 2 3
4 5 6
7 8
我尝试了多种missing_values
,filling_values
选项的安排,但无法使其发挥作用:
import numpy as np
sol = np.genfromtxt("a.txt",
dtype=float,
invalid_raise=False,
missing_values=None,
usemask=True,
filling_values=0.0)
print sol
我想得到的是:
[[1.0 2.0 3.0]
[4.0 5.0 6.0]
[7.0 8.0 0.0]]
但我得到了:
/usr/local/lib/python2.7/dist-packages/numpy/lib/npyio.py:1641: ConversionWarning: Some errors were detected !
Line #3 (got 2 columns instead of 3)
warnings.warn(errmsg, ConversionWarning)
[[1.0 2.0 3.0]
[4.0 5.0 6.0]]
答案 0 :(得分:6)
使用pandas:
import pandas as pd
df = pd.read_table('data', sep='\s+', header=None)
df.fillna(0, inplace=True)
print(df)
# 0 1 2
# 0 1 2 3
# 1 4 5 6
# 2 7 8 0
pandas.read_table
用NaN
替换丢失的数据。您可以使用NaN
将这些df.fillna
替换为其他值。
df
是pandas.DataFrame
。您可以使用df.values
访问基础NumPy数组:
print(df.values)
# [[ 1. 2. 3.]
# [ 4. 5. 6.]
# [ 7. 8. 0.]]
答案 1 :(得分:3)
问题是numpy不喜欢不规则的数组。由于文件最后一行的第三个位置没有字符,因此genfromtxt甚至不知道要解析的内容,更不用说如何处理它了。如果缺失的值有填充物(任何填充物),例如:
1 2 3
4 5 6
7 8 ''
然后你就可以:
sol = np.genfromtxt("a.txt",
dtype=float,
invalid_raise=False,
missing_values='',
usemask=False,
filling_values=0.0)
和: 溶胶
array([[ 1., 2., 3.],
[ 4., 5., 6.],
[ 7., 8., nan]])
不幸的是,如果不能选择使文件的列统一,那么您可能会遇到逐行解析。
另一种可能性是如果所有“短”行都在最后......在这种情况下,您可以利用'usecols'标志来解析所有统一的列,然后使用skip_footer标志对剩余的列执行相同的操作,同时跳过那些不可用的列:
sol = np.genfromtxt("a.txt",
dtype=float,
invalid_raise=False,
usemask=False,
filling_values=0.0,
usecols=(0,1))
sol
array([[ 1., 2.],
[ 4., 5.],
[ 7., 8.]])
sol2 = np.genfromtxt("a.txt",
dtype=float,
invalid_raise=False,
usemask=False,
filling_values=0.0,
usecols=(2,),
skip_footer=1)
sol2
array([ 3., 6.])
然后组合那里添加填充值的数组:
sol2=np.append(sol2, 0.0)
sol2=sol2.reshape(3,1)
sol=np.hstack([sol,sol2])
sol
array([[ 1., 2., 3.],
[ 4., 5., 6.],
[ 7., 8., 0.]])
答案 2 :(得分:0)
根据我的经验,最好只是手动解析,这个功能对我有用,可能很慢但通常足够快。
def manual_parsing(filename,delim,dtype):
out = list()
lengths = list()
with open(filename,'r') as ins:
for line in ins:
l = line.split(delim)
out.append(l)
lengths.append(len(l))
lim = np.max(lengths)
for l in out:
while len(l)<lim:
l.append("nan")
return np.array(out,dtype=dtype)