从数据文件中获取包含列标题和数据列的python映射

从数据文件中获取包含列标题和数据列的python映射,python,file,csv,map,numpy,Python,File,Csv,Map,Numpy,我有一个以下格式的文件: # a, b, c 0.1 0 0 0.2 0.4 0.5 4 5 0.9 0.3 0 10 这是一个包含3列数据的文件,这些列的名称是a、b和c 目前,为了读取这些数据,我使用: def readdata(filename): a, b, c = np.loadtxt(filename, unpack=True) return a, b, c 但与此相反,我希望readdata返回带有{column title,numpy a

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

# a, b, c
0.1   0   0
0.2 0.4 0.5
  4   5 0.9
0.3   0  10
这是一个包含3列数据的文件,这些列的名称是
a
b
c

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

def readdata(filename):
    a, b, c = np.loadtxt(filename, unpack=True)
    return a, b, c
但与此相反,我希望
readdata
返回带有
{column title,numpy array}
的map
mydata
,这样我就可以调用
mydata[“a”]
来获取第一列。如果文件有新的列(
d、e、f…
),我希望此函数能够工作


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

您可以使用

import pandas
dataframe = pandas.read_csv(my_file)
然后,您只需执行以下操作即可获得您的专栏:

my_column_series = dataframe['column_name']

请注意,csv文件的第一行(标题)必须包含列名称。否则,您必须手动为数据帧指定名称。

您可以使用

import pandas
dataframe = pandas.read_csv(my_file)
然后,您只需执行以下操作即可获得您的专栏:

my_column_series = dataframe['column_name']
请注意,csv文件的第一行(标题)必须包含列名称。否则,您必须手动为数据帧指定名称。

使用此文件:

#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])
>>将numpy作为np导入
>>>struct=[(名称,'float')表示标头中的名称]
>>>data=np.loadtxt('/tmp/testnp.txt',dtype=struct,comments='#')
>>>资料
数组([(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',':

#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])
>>将numpy作为np导入
>>>struct=[(名称,'float')表示标头中的名称]
>>>data=np.loadtxt('/tmp/testnp.txt',dtype=struct,comments='#')
>>>资料
数组([(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','如果您使用关键字
names=True
调用numpy函数,则此功能由numpy函数提供

例如:

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

此功能由numpy函数提供,如果您使用关键字
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. ])