如何从文本文件加载数据然后将它们放在字典中?

时间:2017-04-08 05:58:42

标签: python numpy dictionary file-io

我有一个数据文件,其中前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

索引如何无效?

2 个答案:

答案 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解决方案有点短。