Python 如何使用np.genfromtxt并填写缺少的列?

Python 如何使用np.genfromtxt并填写缺少的列?,python,numpy,Python,Numpy,我试图使用np.genfromtxt将类似以下内容的数据加载到矩阵中: 0.79 0.10 0.91 -0.17 0.10 0.33 -0.90 0.10 -0.19 -0.00 0.10 -0.99 -0.06 0.10 -0.42 -0.66 0.10 -0.79 0.21 0.10 0.93 0.79 0.10 0.91 -0.72 0.10 0.25 0.64 0.10 -0.27 -0.36 0.10 -0.66 -0.52 0.10 0.9

我试图使用
np.genfromtxt
将类似以下内容的数据加载到矩阵中:

0.79  0.10  0.91   -0.17 0.10  0.33  -0.90 0.10  -0.19 -0.00 0.10  -0.99 -0.06 0.10  -0.42 -0.66 0.10  -0.79 0.21  0.10  0.93  0.79  0.10  0.91  -0.72 0.10  0.25  0.64  0.10  -0.27 -0.36 0.10  -0.66 -0.52 0.10  0.92  -0.39 0.10  0.43  0.63  0.10  0.25  -0.58 0.10  -0.03 0.59  0.10  0.02  -0.69 0.10  0.79  0.30  0.10  0.09  0.70  0.10  0.67  -0.04 0.10  -0.65 -0.07 0.10  0.70  -0.06 0.10  0.08  7  566 112 32 163 615 424 543 424 422 490 47 499 595 94 515 163 535 
 0.79  0.10  0.91   -0.17 0.10  0.33  -0.90 0.10  -0.19 -0.00 0.10  -0.99 -0.06 0.10  -0.42 -0.66 0.10  -0.79 0.21  0.10  0.93  0.79  0.10  0.91  -0.72 0.10  0.25  0.64  0.10  -0.27 -0.36 0.10  -0.66 -0.52 0.10  0.92  -0.39 0.10  0.43  0.63  0.10  0.25  -0.58 0.10  -0.03 0.59  0.10  0.02  -0.69 0.10  0.79  0.30  0.10  0.09  0.70  0.10  0.67  -0.04 0.10  -0.65 -0.07 0.10  0.70  -0.06 0.10  0.08  263 112 32 30 163 366 543 457 424 422 556 55 355 485 112 515 163 509 112 535 
 0.79  0.10  0.91   -0.17 0.10  0.33  -0.90 0.10  -0.19 -0.00 0.10  -0.99 -0.06 0.10  -0.42 -0.66 0.10  -0.79 0.21  0.10  0.93  0.79  0.10  0.91  -0.72 0.10  0.25  0.64  0.10  -0.27 -0.36 0.10  -0.66 -0.52 0.10  0.92  -0.39 0.10  0.43  0.63  0.10  0.25  -0.58 0.10  -0.03 0.59  0.10  0.02  -0.69 0.10  0.79  0.30  0.10  0.09  0.70  0.10  0.67  -0.04 0.10  -0.65 -0.07 0.10  0.70  -0.06 0.10  0.08  311 112 32 543 457 77 639 355 412 422 509 112 535 163 77 125 30 412 422 556 55 355 485 112 515 
假设我想将数据导入一个大小为(4,5)的矩阵中。如果并非所有行都有5列,则在导入矩阵时,应将没有5行的列替换为“”。例如,如果数据更简单,则如下所示:

1,2,3,4,5
6,7,8,9,10
11,12,13,14,15
16,"","","",""
因此,我希望导入的列数与max row column count的列数匹配,如果一行没有那么多的列,它将用“”填充它。我正在读取一个名为“data.txt”的文件

这就是我迄今为止所尝试的:

trainData = np.genfromtxt('data.txt', usecols = range(0, 5), invalid_raise=False, missing_values = "", filling_values="")
但是,它给出的错误是:

Line #4 (got 1 columns instead of 5)
我怎样才能解决这个问题


谢谢

Pandas有更强大的阅读器,您可以使用
DataFrame
方法来处理缺少的值

您必须先计算要使用多少列:

columns = max(len(l.split()) for l in open('data.txt'))
要读取文件,请执行以下操作:

import pandas
df = pandas.read_table('data.txt', 
                       delim_whitespace=True, 
                       header=None, 
                       usecols=range(columns), 
                       engine='python')
要转换为numpy数组,请执行以下操作:

import numpy
a = numpy.array(df)
<>这将填入空白位置的NANS。您可以使用
.fillna()
获取空格的其他值

filled = numpy.array(df.fillna(999))

您需要将
filling_values
参数修改为
np.nan
(这被认为是float类型,因此您不会有字符串转换问题),并将分隔符指定为逗号,因为默认情况下
genfromtxt
只需要空格作为分隔符:

trainData = np.genfromtxt('data.txt', usecols = range(0, 5), invalid_raise=False, missing_values = "", filling_values=np.nan, delimiter=',')

我设法想出了一个解决办法

df = pandas.DataFrame([line.strip().split() for line in open('data.txt', 'r')])
data = np.array(df)

通过对3条大行的复制粘贴,该熊猫阅读器可以工作:

In [149]: pd.read_csv(BytesIO(txt), delim_whitespace=True,header=None,error_bad_
     ...: lines=False,names=list(range(91)))
Out[149]: 
     0    1     2     3    4     5    6    7     8    9   ...     81   82  \
0  0.79  0.1  0.91 -0.17  0.1  0.33 -0.9  0.1 -0.19 -0.0  ...    515  163   
1  0.79  0.1  0.91 -0.17  0.1  0.33 -0.9  0.1 -0.19 -0.0  ...    515  163   
2  0.79  0.1  0.91 -0.17  0.1  0.33 -0.9  0.1 -0.19 -0.0  ...    125   30   

    83     84     85    86     87     88     89     90  
0  535    NaN    NaN   NaN    NaN    NaN    NaN    NaN  
1  509  112.0  535.0   NaN    NaN    NaN    NaN    NaN  
2  412  422.0  556.0  55.0  355.0  485.0  112.0  515.0  
\获取数组的.values


关键是指定一个足够大的
名称
列表。熊猫可以填充不完整的行,而
genfromtxt
需要显式分隔符。

您需要填充额外的分隔符,
'16,,'
genfromtxt
不能为您这样做。那么我该怎么做呢?我可以手动解析文件并以某种方式添加它们以生成相同的矩阵吗?使用标准的文件读取和编辑方法
genfromtxt
接受任何可以为其提供行的输入。您所说的标准文件读取和编辑方法是什么意思。我不明白,我应该逐行读取文件,然后在执行此操作时填写“”,然后将字符串列表传递给
genfromtxt
?请帮助,我仍然无法理解。不幸的是,这不起作用。我尝试了
df=pandas.read\u csv(train\u file,delim\u whitespace=True,header=None)
,我得到一个错误,说
错误标记数据。C错误:第4行预期有81个字段,SAW91
。我不明白为什么在python中这么做很困难,在Julia中,我只需对您发布的数据进行测试即可。也许发布您的实际数据文件,我可以检查如何修复它。我认为问题在最后一部分,即整数。有没有办法手动解析它并创建一个包含浮点数和整数的矩阵,其中整数部分(似乎是缺少数据的部分)如果不存在则用“”填充?只要知道要使用多少列,使用python引擎就可以了。我已经编辑了答案。您的编辑无效,因为数据框的形状是
(1719,84)
,而不是
(11800×145)
。它似乎省略了长度不为84的列。但是,列的值是正确的。有什么想法吗?这不起作用,给出了与以前相同的错误:
行#1(得到了130列而不是146列)
等等。它适用于您提供的示例。您的数据看起来如何?实际上,只使用
np.genfromtxt('data.txt',delimiter=',')
对我来说很有用。您使用的是什么版本的numpy/python?我使用的是python 3。你确定它对我在问题顶部发布的数据有效吗?不是有5列的,而是有3行的。不适合我。这个命令似乎在数据栏的中间添加了一些随机数据,“对不起”,我误解了你的问题。使用
df=pandas再次尝试@chthonicdaemon应答。读取\u csv(train\u file,delim\u whitespace=True,header=None,usecols=range(91))
应该可以工作,因为
pandas
会自动用
nan
填充缺少的值。使用参数
usecols=range(91)
很重要,因此您必须知道cols的#。否则请重试。您确定它应该是
usecols=range(91)
?因为这会产生一个错误:
ValueError:Usecols与名称不匹配。
这将为您提供一个字符串数组。如果这不是您想要的,您可以使用
data=np.array(df.astype('float64'))