我有一个数据文件,其中前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 :(得分:0)
为此使用pandas
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()
答案 1 :(得分:0)
您可以使用CSV阅读器和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()
请注意,pandas解决方案有点短。