使用NA将数据读入python并计算平均行数

时间:2014-12-31 12:09:59

标签: python arrays python-3.x numpy nan

我正在读取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

但是我收到了错误。

1 个答案:

答案 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.        ])