我有一个csv文件,其中第一列包含标识符,第二列包含相关数据。标识符被复制任意次数,因此文件看起来像这样
data1,123
data1,345
data1,432
data2,654
data2,431
data3,947
data3,673
我想合并记录,为每个标识符生成一条记录并获取
data1,123,345,432
data2,654,431
data3,947,673
有没有一种有效的方法在python或numpy中执行此操作?由于重复键,字典似乎没有了。目前,我在列表列表中有行,然后循环并使用列表中索引0处的先前值测试身份,但这非常笨拙。谢谢你的帮助。
答案 0 :(得分: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))
或类似的事情,我现在无法测试它)
答案 1 :(得分:3)
如果值是列表,则可以使用字典。 defaultdict
模块中的collections
对此非常有用。
答案 2 :(得分: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]