2017-04-08 4 views
1

I haben eine Datendatei, in der die ersten 4 CSV der Schwimmer sind, und der letzte Wert ist eine Zeichenfolge, die für diese ReiheWie lade ich Daten aus einer Textdatei und lege sie dann in ein Wörterbuch ein?

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

Ich möchte, laden, die Datei in eine numpy Array, das ihnen ein Etikett repräsentiert organisiert von Klassen, so wäre der Ausgang so etwas wie:

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

Es ist sehr ähnlich, aber ich konnte nicht in meinem eigenen Code zu arbeiten: Best way to separate data into 3 classes

Dieser Code funktioniert, aber ich kann nicht herausfinden, wie man es nicht innerhalb eines jeden Datenpunkt das Etikett hinzuzufügen:

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' 

Sobald ich, dass die Art, wie ich es will, werde ich den Mittelwert und Co Varianzmatrix berechnen von dort.

EDIT: Wenn ich den Code aus der gelinkten Seite laufen lasse, erhalte ich folgende Fehlermeldung:

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

Wie ist der Index ungültig?

+0

Bitte poste nicht in externen Code-Repositories und stelle keine Fragen zu extern gepostetem Code. – DyZ

Antwort

0

Verwenden Pandas für die

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

Hm. Gibt es einen Weg, es ohne Pandas zu tun? – cparks10

+0

@ cparks10 Wenn Sie numpy verwenden, warum nicht auch Pandas verwenden? – DyZ

+0

@ cparks10 Sicher, aber das wäre viel schmerzhafter. – gsmafra

0

Sie diese mit CSV-Leser und itertools tun können:

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']]} 

Sie können mit Pandas das gleiche tun, auch:

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() 

Hinweis dass die Pandas-Lösung etwas kürzer ist.

Verwandte Themen