【问题标题】:get column names from numpy genfromtxt in python从python中的numpy genfromtxt获取列名
【发布时间】:2016-08-29 22:24:02
【问题描述】:

在 python 中使用 numpy genfromtxt,我希望能够将列标题作为给定数据的键。我尝试了以下方法,但无法获取相应数据的列名。

column = np.genfromtxt(pathToFile,dtype=str,delimiter=',',usecols=(0))
columnData = np.genfromtxt(pathToFile,dtype=str,delimiter=',')
data = dict(zip(column,columnData.tolist()))

下面是数据文件

header0,header1,header2
mydate,3.4,2.0
nextdate,4,6
afterthat,7,8

目前,它将数据显示为

{
  "mydate": [
    "mydate",
    "3.4",
    "2.0"
  ],
  "nextdate": [
    "nextdate",
    "4",
    "6"
  ],
  "afterthat": [
    "afterthat",
    "7",
    "8"
  ]
}

我想采用这种格式

{
  "mydate": {
    "header1":"3.4",
    "header2":"2.0"
  },
  "nextdate": {
    "header1":"4",
    "header2":"6"
  },
  "afterthat": {
   "header1":"7",
   "header2":  "8"
  }
}

有什么建议吗?

【问题讨论】:

标签: python numpy genfromtxt


【解决方案1】:

使用熊猫模块:

In [94]: fn = r'D:\temp\.data\z.csv'

将 CSV 读入数据框:

In [95]: df = pd.read_csv(fn)

In [96]: df
Out[96]:
     header0  header1  header2
0     mydate      3.4      2.0
1   nextdate      4.0      6.0
2  afterthat      7.0      8.0

得到想要的字典:

In [97]: df.set_index('header0').to_dict('index')
Out[97]:
{'afterthat': {'header1': 7.0, 'header2': 8.0},
 'mydate': {'header1': 3.3999999999999999, 'header2': 2.0},
 'nextdate': {'header1': 4.0, 'header2': 6.0}}

或作为 JSON 字符串:

In [107]: df.set_index('header0').to_json(orient='index')
Out[107]: '{"mydate":{"header1":3.4,"header2":2.0},"nextdate":{"header1":4.0,"header2":6.0},"afterthat":{"header1":7.0,"header2":8.0}}'

【讨论】:

  • 为什么是 3.3999999999999999??
  • @RAVI,它是4.0 的python/pandas 表示;)
  • 为什么只有 3.4 -> 3.3999999999999999 而没有任何其他值,如 2.0 -> 1.9999999999999999?同样在 to_json 输出中它正确地得到了 3.4。 to_dict 有什么问题吗??
  • @RAVI,我不知道 python/pandas 何时决定以不同的方式表示浮点数。但是您可以通过以下示例print(0.1 + 0.2) 看到它。顺便说一句:df.to_dict('index') 正确显示浮动...
【解决方案2】:

使用您的示例文件和 genfromtxt 调用,我得到 2 个数组:

In [89]: column
Out[89]: 
array(['header0', 'mydate', 'nextdate', 'afterthat'], 
      dtype='<U9')
In [90]: columnData
Out[90]: 
array([['header0', 'header1', 'header2'],
       ['mydate', '3.4', '2.0'],
       ['nextdate', '4', '6'],
       ['afterthat', '7', '8']], 
      dtype='<U9')

拉出columnData的第一行

In [91]: headers=columnData[0,:]
In [92]: headers
Out[92]: 
array(['header0', 'header1', 'header2'], 
      dtype='<U9')

现在构造一个字典字典(我不需要单独的column 数组):

In [94]: {row[0]: {h:v for h,v in zip(headers, row)} for row in columnData[1:]}
Out[94]: 
{'afterthat': {'header0': 'afterthat', 'header1': '7', 'header2': '8'},
 'mydate': {'header0': 'mydate', 'header1': '3.4', 'header2': '2.0'},
 'nextdate': {'header0': 'nextdate', 'header1': '4', 'header2': '6'}}

稍微完善一下:

In [95]: {row[0]: {h:v for h,v in zip(headers[1:], row[1:])} for row in columnData[1:]}
Out[95]: 
{'afterthat': {'header1': '7', 'header2': '8'},
 'mydate': {'header1': '3.4', 'header2': '2.0'},
 'nextdate': {'header1': '4', 'header2': '6'}}

我喜欢字典理解!

您的列表字典版本:

In [100]: {row[0]:row[1:] for row in columnData[1:].tolist()}
Out[100]: {'afterthat': ['7', '8'], 'mydate': ['3.4', '2.0'], 'nextdate': ['4', '6']}

【讨论】:

  • 这对 numpy 非常有效。非常感谢。我不能使用 pandas,因为在我的情况下,除非有正当理由,否则新安装非常有选择性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-10
  • 2011-11-25
  • 2015-07-27
  • 2015-11-22
  • 2018-05-15
  • 2019-04-08
  • 2013-01-14
相关资源
最近更新 更多