2017-10-19 16 views
2

Voici mon essai à quelque chose de plus simple.Convertir un objet GroupBy (groupby(). Size) dans un dictionnaire

demo = pd.DataFrame(data=np.array([["APPLE", "APPLE", "APPLE", "MANGO", "MANGO"], 
          ["DOWN", "DOWN", "DOWN", "UP", "DOWN"]])) 

demo = demo.T 
demo.columns = ['FRUIT', 'DIRECTION'] 

Voici ce que la trame de données ci-dessus ressemble

FRUIT DIRECTION 
0 APPLE DOWN 
1 APPLE DOWN 
2 APPLE DOWN 
3 MANGO UP 
4 MANGO DOWN 

et maintenant

labels = demo["DIRECTION"] 
l, v = np.unique(labels, return_counts=True) 
d = dict(zip(l, v)) 
print(d) 

Cela me donne les comptes uniques de la colonne 'MODE'. Maintenant, et si je voulais trouver la fréquence des comptes de la colonne «FRUIT» groupée par la colonne «DIRECTION».

Je l'ai fait.

Cela m'a donné,

FRUIT DIRECTION 
APPLE DOWN   3 
MANGO DOWN   1 
     UP   1 

J'ai des problèmes avec la sortie ci-dessus.

Je voulais être en mesure de faire ce qui suit:

a) APPLE n'a rien dans la direction, donc je voulais que montrer 0. comme le tableau ci-dessous.

FRUIT DIRECTION 
APPLE DOWN   3 
     UP   0 
MANGO DOWN   1 
     UP   1 

b) Je voulais être en mesure de créer un dictionnaire comme si

{'APPLE': {DOWN: 3, UP: 0}, 'MANGO': {DOWN: 1, UP: 1}} 

Toute autre façon de reproduire le dictionnaire ci-dessus est aussi très bien. J'utilise Python 3.

Répondre

2

Démo:

partie a

In [19]: x = demo.groupby(['FRUIT', 'DIRECTION']).size() 

In [20]: x 
Out[20]: 
FRUIT DIRECTION 
APPLE DOWN   3 
MANGO DOWN   1 
     UP   1 
dtype: int64 

In [21]: idx = pd.MultiIndex.from_product((df.FRUIT.unique(), df.DIRECTION.unique())) 

In [22]: x.reindex(idx).fillna(0) 
Out[22]: 
APPLE DOWN 3.0 
     UP  0.0 
MANGO DOWN 1.0 
     UP  1.0 
dtype: float64 

partie b

In [79]: r = x.reindex(idx).fillna(0) 

In [80]: r.reset_index() \ 
      .groupby('level_0').apply(lambda x: dict(zip(x['level_1'],x[0]))) \ 
      .to_dict() 
Out[80]: {'APPLE': {'DOWN': 3.0, 'UP': 0.0}, 'MANGO': {'DOWN': 1.0, 'UP': 1.0}} 
+0

Merci beaucoup .. Comment puis-je accomplir la partie b? Je suis désolé..J'apprends encore à utiliser des dictionnaires. –

+1

@josh J'étais sur le point de frapper la poste, quand j'ai vu la réponse de Max avec _exactement_ la même chose. Je n'avais pas d'autre choix que de changer d'avis. –

+2

@Abhishek, j'ai également ajouté la solution pour la partie 'b' ;-) – MaxU

1

Une façon plus simple serait d'utiliser unstack et stack

In [4403]: x = demo.groupby(['FRUIT', 'DIRECTION']).size().unstack(fill_value=0) 

PARTIE A

In [4404]: x.stack() 
Out[4404]: 
FRUIT DIRECTION 
APPLE DOWN   3 
     UP   0 
MANGO DOWN   1 
     UP   1 
dtype: int64 

PARTIE B

In [4405]: x.to_dict('index') 
Out[4405]: {'APPLE': {'DOWN': 3, 'UP': 0}, 'MANGO': {'DOWN': 1, 'UP': 1}} 

Détails

In [4406]: x 
Out[4406]: 
DIRECTION DOWN UP 
FRUIT 
APPLE   3 0 
MANGO   1 1 
+0

Ouais, c'est génial! – MaxU