繁体   English   中英

使用numpy.genfromtxt填充缺失值

[英]Filling missing values using numpy.genfromtxt

尽管有以前问题的建议:

使用numpy.genfromtxt()将-9999作为缺失值

使用genfromtxt导入numpy中缺少值的csv数据

我仍然无法处理以缺失值结尾的文本文件,

A.TXT:

1 2 3
4 5 6
7 8

我已经尝试了missing_valuesfilling_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]]

使用熊猫

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_tableNaN替换丢失的数据。 您可以使用df.fillna将这些NaN替换为其他值。

df是一个pandas.DataFrame 您可以使用df.values访问底层的NumPy数组:

print(df.values)
# [[ 1.  2.  3.]
#  [ 4.  5.  6.]
#  [ 7.  8.  0.]]

问题是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)

和:sol

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

根据我的经验,最好只是手动解析,这个功能对我有用,它可能很慢但通常足够快。

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM