【问题标题】:Get a python map with the title of the column and the column of data from a data file从数据文件中获取包含列标题和数据列的python映射
【发布时间】:2013-05-21 15:57:22
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

    标签: python file csv map numpy


    【解决方案1】:

    此功能由 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. ])
    

    【讨论】:

      【解决方案2】:

      有了这个文件:

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

      【讨论】:

        【解决方案3】:

        您可以使用

        将文件读入pandas DataFrame
        import pandas
        dataframe = pandas.read_csv(my_file)
        

        那么你的专栏就在做:

        my_column_series = dataframe['column_name']
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-12-31
          • 1970-01-01
          • 2022-06-28
          • 1970-01-01
          • 2021-11-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多