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'))
。