2012-01-27 58 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