2013-07-10 5 views
2

numpy genfromtxt를 구조화 된 배열로 사용하여 CSV 파일을 읽으려고합니다. 나는 그것을 정렬 한 다음 groupby를 사용하여 열 중 하나의 문자열 값을 기반으로 파일을 그룹으로 분리합니다. 마지막으로 추가 처리를 위해 각 그룹의 열을 연결합니다.파이썬 그룹 및 스플 라이스 : itertools.groupby에서 반환 된 결과 연결

다음은 각 그룹에 대해 특정 열을 반환하려는 작은 예제입니다.

import numpy as np 
from itertools import groupby 

food1 = [[" vegetable", "tomato"], [" vegetable", "spinach"], [" fruit", "watermelon"], [" fruit", "grapes"], [" meat", "beef"]] 

for key, group in groupby(food1, lambda x: x[0]): 
    print key 
    group[:1] 
# In the line above, TypeError: 'itertools._grouper' object is unsubscriptable, I have tried it with food1 or food2 
    for thing in group:  
     print key + ": " + thing[1];  
    print " " 

I 번째 열의 VA 여러 배열을 반환하고자 출력은 상기 제 1 열 값을 그룹화 IES를

그래서 야채 : "토마토」, 「시금치", 과일 : [ "water melon", "grapes"] ... 등

groupby에서 그룹 반환을 시도했지만 iterator이므로 TypeError가 발생합니다. 'itertools._grouper'객체는 구독 취소 가능합니다. .

나는 genfromtxt에서로드 된 데이터를 연결할 수 있다는 것을 알고 있지만 먼저 그룹화하고 나서 문제가되는 연결을 조합 한 것입니다.

data = np.genfromtxt("file.txt", delimiter=',', skiprows=3) 
# splicing a column from the ndarray read from the csv file 
column2 = data[:,2]; 

다른 아이디어는 어떻게이 그룹을 이어 붙일 수 있습니까?

감사합니다.

답변

2

나는이 작업을 수행하려고 생각 :

from itertools import groupby 

food1 = [[" vegetable", "tomato"], [" vegetable", "spinach"], [" fruit", "watermelon"], [" fruit", "grapes"], [" meat", "beef"]] 

data={} 
for key, group in groupby(sorted(food1), key=lambda x: x[0]): 
    data[key.strip()]=[v[1] for v in group] 

데이터는 다음과 같습니다

{'vegetable': ['tomato', 'spinach'], 
'fruit': ['watermelon', 'grapes'], 
'meat': ['beef']} 
+0

덕분에,이 작동합니다. 또 다른 질문에 대한 답은 groupby를 사용하지 않고 값을 그룹화하고 열을 선택하는 또 다른 대안으로 이어졌습니다. http://stackoverflow.com/questions/17560879/python-numpy-split-a-csv-file-by-the -value-of-a-string-column – frank

+1

그룹화하기 전에 목록을 더 잘 정렬합니다. 그렇지 않으면 일부 항목이 손실됩니다. 다음 코드를 사용하여 목록을 정렬 할 수 있습니다. food1.sort (key = lambda x : x [0]) –

+0

@ user2720402 : 실제로. 수정 됨 – dawg