Hoo*_*ked 3 python parsing numpy genfromtxt
尽管有以前问题的建议:
使用numpy.genfromtxt()将-9999作为缺失值
我仍然无法处理以缺失值结尾的文本文件,
A.TXT:
1 2 3
4 5 6
7 8
Run Code Online (Sandbox Code Playgroud)
我已经尝试了多种选项安排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
Run Code Online (Sandbox Code Playgroud)
我想得到的是:
[[1.0 2.0 3.0]
[4.0 5.0 6.0]
[7.0 8.0 0.0]]
Run Code Online (Sandbox Code Playgroud)
但相反,我得到:
/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]]
Run Code Online (Sandbox Code Playgroud)
使用熊猫:
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
Run Code Online (Sandbox Code Playgroud)
pandas.read_table用NaNs 替换缺失的数据.您可以NaN使用其他值替换那些s df.fillna.
df是一个pandas.DataFrame.您可以使用以下命令访问基础NumPy数组df.values:
print(df.values)
# [[ 1. 2. 3.]
# [ 4. 5. 6.]
# [ 7. 8. 0.]]
Run Code Online (Sandbox Code Playgroud)
问题是 numpy 不喜欢参差不齐的数组。由于文件最后一行的第三个位置没有字符,因此 genfromtxt 甚至不知道要解析它,更不用说如何处理它了。如果缺失值有填充物(任何填充物),例如:
1 2 3
4 5 6
7 8 ''
Run Code Online (Sandbox Code Playgroud)
然后你就能够:
sol = np.genfromtxt("a.txt",
dtype=float,
invalid_raise=False,
missing_values='',
usemask=False,
filling_values=0.0)
Run Code Online (Sandbox Code Playgroud)
和:溶胶
array([[ 1., 2., 3.],
[ 4., 5., 6.],
[ 7., 8., nan]])
Run Code Online (Sandbox Code Playgroud)
不幸的是,如果无法使文件的列统一,那么您可能会陷入逐行解析的困境。
另一种可能性是如果所有“短”行都在末尾...在这种情况下,您可以利用 '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.])
Run Code Online (Sandbox Code Playgroud)
然后组合其中的数组并添加填充值:
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.]])
Run Code Online (Sandbox Code Playgroud)