创建数组字典,使用其中一列中的值作为键

时间:2015-11-24 10:09:10

标签: python arrays numpy dictionary

我一直尝试这样做,到目前为止收效甚微。我在python中有一个大的(> 400,000个数据点)2D数组。根据日期(dd \ mm \ yyyy),数组本身可以分成一系列较小的行。

为了实现我的最终目标,我想要做的一件事就是将一个numpy.ndarray(类似于下面的内容,但显然要大得多)更改为一个键字典(每天一个)月)和相应的数组(由每个特定日子的所有原始数组的数据组成)。

[['16/06/2015 00:00'    'card' 'Smith' 'John' 'Full Time']
['16/06/2015 00:00' 'card'  'Doe'   'Jane'  'Part Time']
['17/07/2015 00:00' 'card'  'Doe'   'Jane'  'Part Time']
['18/06/2015 00:00' 'card' 'Smith' 'John' 'Full Time']
['30/06/2015 00:00' 'card'  'Bob'   'Roberts'   'Full Time']
['30/06/2015 00:00' 'card'  'Smith' 'John'  'Full Time']
['30/06/2015 00:00' 'card'  'Bob'   'Roberts'   'Full Time']]

我不确定如何使上面的数组以与我导入的数据相同的代码格式显示,但正如我所提到的,它应该显示为numpy.ndarray。

我有代码,您可以在下面看到,它返回错误"索引错误:用作索引的数组必须是整数(或布尔)类型",这是一个问题,因为我有数据是由字符串组成的。

Array1 = np.genfromtxt('PATH', delimiter="\t", dtype=(str))
y = {}
for row in Array1:
    v = Array1[row[1:]]
    k = row[0]
    y[k]=v

如果您需要更多信息,请询问,我会尝试提供所需的任何信息。我对这一切都很新手。

2 个答案:

答案 0 :(得分:1)

错误消息将指向循环的第一行:正如它所说,这不是您索引数组的方式。 o已经是行中的值列表;您已经知道如何通过row获得单个项目,并获得一个完全相同的列表:row[0]。所以你的代码就是:

row[1:]

请注意,您可以将其简化为

v = row[1:]

实际上整个循环可以作为词典理解来完成:

y[row[0]] = row[1:]

答案 1 :(得分:1)

只需使用csv模块从文件中创建dict来解析它,你需要处理像"16/06/2015 00:00"这样的重复键,可以使用defaultdict来完成,或者只有最后一个值与键相关联:

import csv
from collections import defaultdict
with open("infile") as f:
    d = defaultdict(list)
    for row in csv.reader(f, delimiter="\t"):
        row[0].extend(row[1:])

创建一个数组只是为了创建一个dict是没有意义的,如果你想要一个dict就像上面那样创建dict。