2013-07-10 2 views
2

J'essaye de lire un fichier csv en utilisant numpy genfromtxt dans un tableau structuré. Je prévois de le trier, puis d'utiliser groupby pour séparer le fichier en groupes en fonction des valeurs de chaîne de l'une des colonnes. Enfin, je vais épisser les colonnes de chaque groupe pour un traitement supplémentaire.Groupe Python et splice: épissage du résultat renvoyé par itertools.groupby

Voici un petit exemple dans lequel je souhaite renvoyer une colonne spécifique pour chacun des groupes.

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 " " 

La sortie je voudrais est de retour plusieurs tableaux de la deuxième colonne va; s groupées par la première des valeurs de colonne,

Alors légumes: [ « tomate », « épinards »], fruits : ["melon d'eau", "raisins"] ... etc.

J'ai essayé d'épisser le groupe return de groupby, mais comme c'est un itérateur, j'obtiendrais TypeError: l'objet 'itertools._grouper' est insubmersible . Je sais que je pourrais épisser les données chargées à partir de genfromtxt, mais c'est la combinaison du groupage d'abord puis de l'épissage qui me pose problème.

data = np.genfromtxt("file.txt", delimiter=',', skiprows=3) 
# splicing a column from the ndarray read from the csv file 
column2 = data[:,2]; 

D'autres idées comment pourrais-je accomplir ce groupe puis splice?

Merci.

Répondre

2

Je pense que vous essayez de le faire:

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] 

données est alors:

{'vegetable': ['tomato', 'spinach'], 
'fruit': ['watermelon', 'grapes'], 
'meat': ['beef']} 
+0

Merci, cela fonctionne. Une réponse à une autre question à moi a également conduit à une autre alternative pour grouper les valeurs et sélectionner une colonne sans utiliser groupby http://stackoverflow.com/questions/17560879/python-numpy-split-a-csv-file-by-the -values-of-a-string-column – frank

+1

Mieux trier la liste avant de la grouper; Sinon, vous perdrez des objets. Vous pouvez utiliser le code suivant pour trier la liste: food1.sort (clé = lambda x: x [0]) –

+0

@ user2720402: en effet. Correction faite – dawg

Questions connexes