CSV数据到Numpy结构化数组?

时间:2018-03-01 01:04:29

标签: python python-3.x numpy

Name Class Species
a     1      3
b     2      4
c     3      2
a     1      3
b     2      1
c     3      2

上述数据将来自CSV文件。需要使用numpy将其转换为结构化数组。需要来自csv的标题成为数组的列标签。

需要打印每个类别中每个名称的平均值(第1类,第2类和第3类的每个物种的平均值)

我使用了numpy.genfromtxt()

2 个答案:

答案 0 :(得分:0)

这是从csv文件创建numpy结构化数组的一种方法:

import pandas as pd

arr = pd.read_csv('file.csv').to_records(index=False)

# rec.array([('a', 1, 3), ('b', 2, 4), ('c', 3, 2), ('a', 1, 3), ('b', 2, 1),
#            ('c', 3, 2)], 
#           dtype=[('Name', 'O'), ('Class', '<i8'), ('Numbers', '<i8')])

然后,您可以使用numpy或(更简单)pandas来执行计算。

答案 1 :(得分:0)

在Py3上使用最新的numpy(1.14)。

你的样品,清理过来:

In [93]: txt = """Name --- Class --- Numbers
    ...: a    ---------- 1    -------- 3
    ...: b    ---------- 2    -------- 4
    ...: c    ---------- 3    -------- 2
    ...: a    ---------- 1    -------- 3
    ...: b    ---------- 2     ------- 1
    ...: c    ---------- 3   --------- 2"""
In [94]: data = np.genfromtxt(txt.splitlines(), dtype=None, names=True, encoding=None)
In [95]: data
Out[95]: 
array([('a', '----------', 1, '--------', 3),
       ('b', '----------', 2, '--------', 4),
       ('c', '----------', 3, '--------', 2),
       ('a', '----------', 1, '--------', 3),
       ('b', '----------', 2, '-------', 1),
       ('c', '----------', 3, '---------', 2)],
      dtype=[('Name', '<U1'), ('f0', '<U10'), ('Class', '<i8'), ('f1', '<U9'), ('Numbers', '<i8')])

或跳过虚线列:

In [96]: data = np.genfromtxt(txt.splitlines(), dtype=None, names=True, encoding=None, usecols=[0,2,4])
In [97]: data
Out[97]: 
array([('a', 1, 3), 
       ('b', 2, 4), 
       ('c', 3, 2), 
       ('a', 1, 3), 
       ('b', 2, 1),
       ('c', 3, 2)],
      dtype=[('Name', '<U1'), ('Class', '<i8'), ('Numbers', '<i8')])