2017-04-08 2 views
1

나는 처음 4 개의 CSV의 수레있는 데이터 파일을 가지고 있고, 마지막 값 해당 행에 대한 레이블을 나타내는 문자열입니다텍스트 파일의 데이터를로드 한 다음 사전에 넣으려면 어떻게해야합니까?

.5, .3, .2, .1, FAA 
.2., .3, .5., .2, FXX 
.5., .3, .2 , .9, FXX 
.3, .3, .9, .3, FCA 

내가 그들을 구성하는 NumPy와 배열에 파일을로드 할 클래스에 의해, 그래서 출력는 다음과 같을 것이다

FAA: [[.5, .3, .2, .1]] 
FXX: [[.2., .3, .5., .2], 
     [.5., .3, .2 , .9]] 
FCA: [.3, .3, .9, .3] 

그것은이 매우 유사하지만, 나는 이것이 내 자신의 코드에서 작동시킬 수 없습니다 : Best way to separate data into 3 classes

이 코드는 작동

하지만 각 데이터 포인트의 내부 레이블을 추가 할 방법을 알아낼 수 없습니다 :

import numpy as np 

data = np.genfromtxt('data.txt', delimiter=',', dtype=None, names=('length', 'width', 'distance', 'strength', 'label')) 

separated = {} 
for i in range(len(data)): 
    vector = data[i] 
    if (vector[-1] not in separated): 
     separated[vector[-1]] = [] 
    separated[vector[-1]].append(vector) 
for i in range(len(separated)): 
       print separated 
       print '\n' 

내가 원하는대로, 나는 평균과 공동 분산 행렬을 계산하는 것으로 일단 거기에서.

편집 : 링크 된 페이지에서 코드를 실행하면, 나는 다음과 같은 오류 얻을 :

filtered = [map(float, item[:4]) for item in data if item[4] == 'Iris-virginica'] 
IndexError: invalid index 

어떻게 인덱스가 잘못되었습니다?

+0

외부 코드 저장소에 게시하지 말고 외부 게시 된 코드에 대해서는 질문하지 마십시오. – DyZ

답변

0

사용 당신은 CSV 리더와 함께이 작업을 수행 할 수

import pandas as pd 

df = pd.read_csv('data.txt', 
       delimiter=', ', 
       names=['length', 'width', 'distance', 'strength', 'label']) 

output = {} 
for label in ['FAA', 'FXX', 'FCA']: 
    output[label] = df[df['label'] == label].copy().drop('label', 1).as_matrix() 
+0

흠. 판다를 사용하지 않고 그것을 할 수있는 방법이 있습니까? – cparks10

+0

@ cparks10 numpy를 사용하는 경우 팬더를 사용하지 않는 이유는 무엇입니까? – DyZ

+0

@ cparks10 그래도 그게 더 고통 스러울거야. – gsmafra

0

에 대한 팬더와 itertools :

from operator import itemgetter 
import csv, itertools 
# Create a reader 
with open('data.txt') as infile: 
    rdr = csv.reader(infile) 
    # Group the rows by the last column 
    data = itertools.groupby(sorted(rdr, key=itemgetter(-1)), key=itemgetter(-1)) 
# Build a dictionary 
dict((key.strip(), [value[:-1] for value in values]) for key,values in data) 
#{'FXX': [['.2.', ' .3', ' .5.', ' .2'], ['.5.', ' .3', ' .2 ', ' .9']], 
# 'FCA': [['.3', ' .3', ' .9', ' .3']], 
# 'FAA': [['.5', ' .3', ' .2', ' .1']]} 

당신은 너무, 팬더와 같은 작업을 수행 할 수 있습니다

import pandas as pd 
# Create a dataframe; note how the regular expression cleanses whitespaces 
df = pd.read_csv('data.txt', header=None, delimiter='\s*,\s*') 
# Group rows by the last column 
df.groupby(4).apply(lambda x: x.iloc[:,:-1].values.tolist()).to_dict() 

주 판다의 해결책은 다소 짧다.