我有大量的制表符分隔数据。我想计算每列的平均值。问题是某些值为“无”,我想执行计算并排除这些数据点。
数据结构如下所示:
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)
答案 0 :(得分:2)
open
的默认模式为r
或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
函数接受一个可迭代的对象,类似于list
(我们的情况)或tuple
。并len
给你一个列表的长度。
答案 1 :(得分:1)
查找map
和zip
个功能。这是一些示例(修改它以满足您的需求)
>>> 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]
答案 2 :(得分: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)
我的评论中的答案问题是,我认为它会将列向左移动,并导致您获得您可能不想要的值。