1

我有一个格式如下的文件:

# a, b, c
0.1   0   0
0.2 0.4 0.5
  4   5 0.9
0.3   0  10

这是一个包含 3 列数据的文件,这些列的名称是a,bc.

目前要读取这些数据,我使用:

def readdata(filename):
    a, b, c = np.loadtxt(filename, unpack=True)
    return a, b, c

但不是那样,我想readdata返回一个地图mydata{column title, numpy array}这样我就可以调用mydata["a"]来获取第一列。d, e, f...如果文件有新列 ( ) ,我希望这个函数能够工作。

如何做到这一点(尽可能避免不必要的副本)?

4

3 回答 3

3

这个功能是由 numpy 函数提供的np.genfromtxt,如果你用关键字调用它names=True

例子:

>>> s = """# a, b, c
... 0.1 0 0
... 0.2 0.4 0.5
... 4 5 0.9
... 0.3 0 10
... """
>>> data = np.genfromtxt(StringIO(s),names=True)
>>> data['a']
array([ 0.1,  0.2,  4. ,  0.3])
>>> data['b']
array([ 0. ,  0.4,  5. ,  0. ])
>>> data['c']
array([  0. ,   0.5,   0.9,  10. ])
于 2013-05-27T04:01:41.580 回答
1

使用此文件:

#a, b, c
0.1   0   0
0.2 0.4 0.5
  4   5 0.9
0.3   0  10

假设您的第一行定义了标题行,在 Numpy 中,您可以这样做:

首先,阅读标题行:

>>> with open('/tmp/testnp.txt','r') as f:
...    header=[n.strip() for n in f.readline().strip().lstrip('#').split(',')]
... 
>>> header
['a', 'b', 'c']

现在,在 Numpy 中创建一个结构化数组,其名称与标题中的字段相同:

>>> import numpy as np
>>> struct=[(name,'float') for name in header]
>>> data=np.loadtxt('/tmp/testnp.txt',dtype=struct,comments='#')
>>> data
array([(0.1, 0.0, 0.0), (0.2, 0.4, 0.5), (4.0, 5.0, 0.9), (0.3, 0.0, 10.0)], 
      dtype=[('a', '<f8'), ('b', '<f8'), ('c', '<f8')])
>>> data['a']
array([ 0.1,  0.2,  4. ,  0.3])
于 2013-05-26T19:21:48.697 回答
0

您可以将文件读入pandas DataFrame

import pandas
dataframe = pandas.read_csv(my_file)

然后你让你的专栏做:

my_column_series = dataframe['column_name']

请注意,您的 csv 文件必须有一个带有 column_name 的第一行(标题)。否则,您必须手动为数据框命名。

于 2013-05-26T18:21:56.310 回答