2017-10-19 4 views
2

Hier ist mein Versuch, etwas einfacher.Konvertieren Sie ein GroupBy-Objekt (groupby(). Größe) in ein Wörterbuch

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

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

Hier ist, was die oben Datenrahmen wie

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

und jetzt

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

Spalte Das gibt mir die einmalige zählt der 'ANFAHRT' aussieht.

{'DOWN': 3, 'UP': 2} 

Nun, was ist, wenn ich die Frequenz der Zählungen von ‚FRUIT‘ Spalte gruppiert nach ‚direction‘ Spalte finden wollte.

Ich habe dies getan.

Dies gab mir,

FRUIT DIRECTION 
APPLE DOWN   3 
MANGO DOWN   1 
     UP   1 

Ich habe Probleme mit dem oben ausgegeben.

Ich wollte folgend in die Lage sein zu tun:

a) APPLE nichts in der AUF-Richtung hat, so wollte ich, dass als 0 wie die Tabelle unten angegeben zeigen.

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

b) Ich wollte in der Lage sein, es wie so

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

Jede andere Art und Weise in ein Wörterbuch zu erstellen, die oben Wörterbuch zu reproduzieren ist auch in Ordnung. Ich verwende Python 3.

Antwort

2

Demo:

Teil 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 

Teil 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

Vielen Dank .. Wie beende ich Teil b? Es tut mir Leid..Ich lerne immer noch Wörterbücher zu benutzen. –

+1

@josh Ich wollte gerade Post bekommen, als ich Max 'Antwort mit _exactly_ die gleiche Sache sah. Ich hatte keine andere Wahl als zu verbessern. –

+2

@Abhishek, ich habe auch eine Lösung für den Teil 'b' hinzugefügt ;-) – MaxU

1

Eine einfachere Möglichkeit wäre, verwenden unstack und stack

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

TEIL A

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

TEIL B

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

Einzelheiten

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

Ja, sieht gut aus! – MaxU

Verwandte Themen