2015-10-21 15 views

risposta

41

È possibile utilizzare di size groupby:

In [11]: df.groupby(["Group", "Size"]).size() 
Out[11]: 
Group  Size 
Moderate Medium 1 
      Small  1 
Short  Small  2 
Tall  Large  1 
dtype: int64 

In [12]: df.groupby(["Group", "Size"]).size().reset_index(name="Time") 
Out[12]: 
     Group Size Time 
0 Moderate Medium  1 
1 Moderate Small  1 
2  Short Small  2 
3  Tall Large  1 
+0

Grazie. Un'aggiunta minore per scegliere i valori massimi di k (= 20) in base alla frequenza ("Tempo"): df.groupby (["Gruppo", "Dimensione"]). Dimensione(). Reset_index (name = "Ora") .sort_values ​​(da 'Time' =, ascendente = false) .head (20); –

10

Si può anche provare pd.crosstab()

Group   Size 

Short   Small 
Short   Small 
Moderate  Medium 
Moderate  Small 
Tall   Large 

pd.crosstab(df.Group,df.Size) 


Size  Large Medium Small 
Group       
Moderate  0  1  1 
Short   0  0  2 
Tall   1  0  0 

EDIT: Al fine di ottenere il vostro fuori messo

pd.crosstab(df.Group,df.Size).replace(0,np.nan).\ 
    stack().reset_index().rename(columns={0:'Time'}) 
Out[591]: 
     Group Size Time 
0 Moderate Medium 1.0 
1 Moderate Small 1.0 
2  Short Small 2.0 
3  Tall Large 1.0 
+1

bello. puoi anche aggiungere 'margins = True' per ottenere i conteggi marginali! –

Problemi correlati