2012-01-27 56 views
3

我有一个csv文件,其中第一列包含标识符和第二列关联数据。标识符被复制任意次数,所以文件看起来像这样。
data1,123
data1,345
data1,432
data2,654
data2,431
data3,947
data3,673在python或numpy中合并记录

我想合并的记录产生单记录每个标识符并获取。
data1,123,345,432
data2,654,431
data3,947,673

是否有一个有效的方式Python或numpy的做到这一点?字典由于重复的键而显示出来。目前,我在列表中列出了行,然后循环并测试列表中索引为0的前一个值的身份,但这非常笨拙。谢谢你的帮助。

+1

“字典似乎是出因重复键”我不知道我明白为什么这是一个问题。具有值列表的字典是否不起作用?就像在你的例子中一样,用'{'data1':[123,345,432],'data2':[654,431],'data3':[947,673] }' – 2012-01-27 00:48:25

回答

3

如果第一列中给定值的所有实例都是连续的,则这是itertools.groupby的理想用例。它将被用来这样的:

from itertools import groupby 
from csv import reader 
from operator import itemgetter 

with open(filename) as f: 
    for k, g in groupby(reader(f), key=itemgetter(0)): 
     record = ','.join(k, *g) 
     # do something with record, e.g. write to a file 

(你可能要做','.join(k, *list(g))或类似的东西,我不能在此刻对它进行测试)

+0

非常感谢。我不知道在这方面做了什么*,但是如果我在加入g变量时对其进行了缩写,这种方法就行得通。我得到了下面的第一个工作,并与之一起工作。 – 2012-01-27 17:12:39

+0

'*'是参数解包运算符,它将列表转换为函数参数。所以'f(x,* y)'等价于'f(x,y [0],y [1],...)'。 – 2012-01-27 18:08:49

3

您可以使用字典如果值是列表。 defaultdictcollections模块中对此非常有用。

1

这是你如何使用defaultdict做你需要什么,

import csv 
from collections import defaultdict 

records = defaultdict(list) 
for key, value in csv.reader(open(filename)): 
    records[key].append(int(value)) 

for key in records: 
    print key, records[key] 

结果,

data1 [123, 345, 432] 
data3 [947, 673] 
data2 [654, 431] 
+0

非常感谢(和MRAB)。这样做的工作和脚本正在工作。 – 2012-01-27 17:13:39