2013-07-10 7 views
2

Я пытаюсь прочитать файл csv, используя numpy genfromtxt, в структурированный массив. Я планирую сортировать его, а затем использовать groupby для разделения файла на группы на основе строковых значений одного из столбцов. Наконец, я буду объединять столбцы из каждой группы для дополнительной обработки.Группа Python и сплайсинг: сплайсирование результата, возвращаемого из 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 " " 

Выходной Я хотел бы возвращаю несколько массивов во втором в колонка; х лет, сгруппированных по значениям первого столбца,

Так растительные: [ «помидоры», «шпинат»], фруктов : ["water melon", "grapes"] ... и т. д.

Я попытался объединить групповой возврат из groupby, но поскольку это итератор, я бы получил 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 -values-of-a-string-column – frank

+1

Лучше отсортировать список перед группировкой; в противном случае вы потеряете некоторые предметы. Вы можете использовать следующий код для сортировки списка: food1.sort (key = lambda x: x [0]) –

+0

@ user2720402: действительно. Исправлена – dawg

 Смежные вопросы

  • Нет связанных вопросов^_^