我正在读取csvfile中的数据并尝试按列计算平均值。虽然列数是固定的,但行数不是。因此,我首先阅读我需要的行,使它们成为一个列表,然后形成一个列表的numpy数组。但它不起作用。
import csv
import numpy
读入(遍历每个文件并查找匹配项,然后将附加):
with open(input_file, mode='r') as f:
reader = csv.reader(f, delimiter=';')
for row in reader:
pass
# matchin algorithm omitted
found_line = row
del found_line[0] #remove first entry on name
input_file
看起来像
Weihnachtsmann;16;30.3125;0.00677830307346;0.000491988890358;0.2796728754;0.00371057513915;0.000667111407605;0.00177896375361
Tannenbaum;6;33.5;0.032918005099;0.00312809941211;0.308224811515;0.0124857679873;0.00644874360685;0.000667111407605
Heilier Klaus;1;NA;NA;NA;NA;NA;NA;NA
然后,我列出了匹配的条目:
author_list.append(','.join(found_line))
author_array = numpy.array(author_list)
我首先没有创建numpy数组,因为我听说它是unpythonic并且缓慢地附加到numpy数组。
print author_arry
产量
['1,NA,NA,NA,NA,NA,NA' '6;33.5;0.032918005099;0.00312809941211;0.308224811515;0.0124857679873;0.00644874360685;0.000667111407605' '16;30.3125;0.00677830307346;0.000491988890358;0.2796728754;0.00371057513915;0.000667111407605;0.00177896375361']
但我甚至不确定这是一个具有我想要的尺寸的数组(应该是正好八列)还是只有一个列和三行。
之后,我必须将来自NA
的{{1}}转换为numpy的R
(如果我正确的话)并且我不知道该怎么做。我试过了
NaN
但是我收到了错误。
答案 0 :(得分:2)
使用NumPy可以从文件中读取数据的方法有很多种。这是使用np.genfromtxt
的一种方式。第一列中的名称变为NumPy nan
值,文件中的任何其他非浮点字符串也是如此:
>>> arr = np.genfromtxt(input_file, delimiter=';', dtype=np.float64)
>>> arr
array([[ nan, 1.60000000e+01, 3.03125000e+01,
6.77830307e-03, 4.91988890e-04, 2.79672875e-01,
3.71057514e-03, 6.67111408e-04, 1.77896375e-03],
[ nan, 6.00000000e+00, 3.35000000e+01,
3.29180051e-02, 3.12809941e-03, 3.08224812e-01,
1.24857680e-02, 6.44874361e-03, 6.67111408e-04],
[ nan, 1.00000000e+00, nan,
nan, nan, nan,
nan, nan, nan]])
这是一个包含3行和9列的数组。要删除每一行的第一个条目,您只需切片并重新分配arr = arr[:, 1:]
。
您可以使用np.nanmean
计算行方式(在计算平均值时忽略nan
值):
>>> np.nanmean(arr, axis=1)
array([ 5.82569998, 4.98298407, 1. ])