我在Spark上使用Python并从.csv文件中读取我的数据集,该文件的第一行是:
17 0.2 7
17 0.2 7
39 1.3 7
19 1 7
19 0 7
当我从文件中逐行读取以下代码时:
# Load and parse the data
def parsePoint(line):
values = [float(x) for x in line.replace(',', ' ').split(' ')]
return LabeledPoint(values[0], values[1:])
我收到了这个错误:
Traceback (most recent call last):
File "<stdin>", line 3, in parsePoint
ValueError: could not convert string to float: "17"
非常感谢任何帮助。
答案 0 :(得分:0)
根据以下评论回答此问题,您应该使用:
[float(x.strip(' "')) for x in line.split(',')]
您无需将','
替换为' '
,只需在split
上,
,然后删除前导和尾随空格和引号(x.strip(' "')
)在转换为float
之前。
另外,请查看可能简化您工作的csv
软件包。
以下是原始问题的答案(在评论之前)。
您需要使用.split()
代替.split(' ')
。您的行中有多个连续的空格字符,因此在' '
上拆分会导致空字符串,例如你的第一行分为:
['17', '', '0.2', '', '7']
问题是那些你(显然)无法转换为float
的空字符串。
使用split()
可以解决问题,因为split
参数为sep
None
(或不存在)时>>> sp5 = ' ' * 5
>>> sp5.split()
[]
>>> sp5.split(' ')
['', '', '', '', '', '']
的行为:
如果可选的第二个参数sep不存在或为None,则单词由空格字符的任意字符串(空格,制表符,换行符,返回,换页)分隔。
请参阅split
的文档,以及一个了解差异的小例子:
$dataTable = array();
$dataTable['cols'] = array(
array('id' => 'time_axis', 'label' => 'Time', 'type' => 'datetime')
);
foreach($sensors as $id => $description) {
//Entries in $sensors are from a database
$column = array('id' => $id, 'label' => $description, 'type' => 'number');
array_push($dataTable['cols'],$column);
}