2012-01-27 2 views
3

첫 번째 열에 식별자와 두 번째 열과 관련된 데이터가있는 csv 파일이 있습니다. 식별자는 임의의 횟수만큼 복제되므로 파일은 다음과 같습니다.
data1,123
data1,345
data1,432
data2,654
data2,431
data3,947
data3,673파이썬 또는 numpy로 레코드 병합

내가 하나를 생성하기 위해 레코드를 병합하고 싶습니다 각 식별자에 대해 기록하고 가져 오십시오.
data1,123,345,432 data2,654,431
data3,947,673

파이썬 또는 NumPy와이 작업을 수행 할 수있는 효율적인 방법이 있나요
? 중복 키로 인해 사전이없는 것 같습니다. 현재 목록의 목록에 줄이 있고 목록에서 색인 0에있는 이전 값과의 동일성을 테스트하지만 매우 서툴 릅니다. 어떤 도움을 주셔서 감사합니다.

+1

잘 모르겠어요 "사전 키를 복제하는 시판 될 것으로 보인다" 왜 이것이 문제인지 이해합니다. 값 목록이있는 사전이 작동하지 않습니까? 당신의 예제에서와 같이'{ 'data1': [123, 345, 432], 'data2': [654, 431], 'data3': [947, 673]으로 끝나는 것을 요리하는 것은 꽤 쉽습니다. }' –

답변

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 

+0

대단히 감사합니다. 이 컨텍스트에서 * 무엇이 있는지는 모르지만이 변수에 합치면 변수 g를 끈 경우이 방법이 효과가 있습니다. 나는 아래에서 하나를 먼저 얻었고 그걸로 갔다. –

+0

'*'는 목록을 함수 인수로 변환하는 인수 unpacking 연산자입니다. 그래서'f (x, * y)'는'f (x, y [0], y [1], ...)'와 같습니다. –

3

당신은 값 경우 사전을 사용할 수 있습니다 (당신은 내가 순간에 그것을 테스트 할 수 없습니다, 그런 ','.join(k, *list(g)) 또는 뭔가를해야 할 수도 있습니다) 목록입니다. collections 모듈의 defaultdict은이 작업에 매우 유용합니다. 당신은 당신이 무엇을해야하는 defaultdict를 사용하는 방법이있다

1

,

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). 이것은 일을했고 스크립트는 작동합니다. –