1

我有大量制表符分隔的数据。我想计算每列的平均值。问题是某些值是“无”,我想执行计算并排除这些数据点。

数据结构如下所示:

0.0     0.5     0.0     0.142857142857  0.0     0.0
0.0     0.0     0.0     0.0             0.0     0.0
0.0     0.8     0.0     None            0.0     0.0

我正在使用这段代码。不知道如何将条件添加到此:

data = [float(l.split('\t')[target_column_val]) \
           for l in open(target_file, 'r').readlines()]
mean = sum(data) / len(data)
4

3 回答 3

2

open具有默认模式ror read。所以,我不在r这里添加open. 我们从中得到一个文件对象作为f. f是可迭代的,所以我们循环遍历f.

这样做之后,我们可以用空格分割行,这样我们为什么要使用for item in var.split()它给我们一个字符串列表,这些字符串是通过将行分割成的f

我们使用if != 'None'是因为这是在这里摆脱"None"值的一种方式。最后我们附加float(item). 因为我们想要浮点数而不是字符串。

with open('targe_file.txt') as f:
    final_list = [float(item) for var in f for item in var.split() if item != 'None']  # None is a string in this instance.

print final_list

试试上面的代码,你可以在迭代之后将 if 语句添加到列表推导中。

然后,您可以像这样计算平均值:

mean = sum(final_list) / len(final_list)

我们可以使用该sum函数将列表中的所有浮点数相加。该sum函数接受一个可迭代对象,例如 a list(我们的例子)或 a tuple。并len为您提供列表的长度。

于 2013-10-23T07:17:27.347 回答
1

寻找mapzip功能。这是一些示例(修改它以满足您的需求)

>>> from numpy import mean
>>>
>>> def safe_float(s):
...     try:
...         return float(s)
...     except ValueError:
...         return s
...
>>> def filter_none(lst):
...     return filter(lambda x: x<>'None', lst)
...
>>> source = ['0.0 0.5 0.0 0.142857142857 0.0 0.0',
...           '0.0 0.0 0.0 0.0 0.0 0.0',
...           '0.0 0.8 0.0 None 0.0 0.0']
>>>
>>> data = [map(safe_float, l.split()) for l in source]
>>> filtered_columns = map(filter_none, zip(*data))
>>> print map(mean, filtered_columns)
[0.0, 0.43333333333333335, 0.0, 0.071428571428499996, 0.0, 0.0]
于 2013-10-23T07:20:37.237 回答
0

您可以if在理解中包含子句:

[l for l in (stuff) if l != 'None']

看看我认为您正在尝试做的事情,我认为应该这样做:

with open(target_file) as infile:
    col = (line.split('\t')[target_column_val] for line in infile)
    data = [float(x) for x in col if x != 'None']
    mean = sum(data)/len(data)

我评论中答案的问题在于,我认为它会将列向左移动,并可能导致您获得您可能不想要的值。

于 2013-10-23T07:08:56.090 回答