2016-12-22 5 views
2

Voici mon dataframe:Pandas - Groupe chaque colonne par lui-même

col1 col2 col3 col4 
0 True False True True 
1 True True False False 
2 False False True False 
3 True True False True 

est-il un moyen de regrouper mes données afin que je reçois quelque chose comme ce qui suit où les chiffres du tableau sont des comptes d'occurrences:

 col2   col3  col4 
     True False True False True False 
col1   
True 2 1  x x  x x 
False 0 1  x x  x x 

Merci beaucoup pour votre aide!

Répondre

2

Définir col1 comme axe d'index. Effectuez l'opération stack pour le remodeler en un objet série formaté long. Regrouper les niveaux 0 et 1 de la série multi-index produit et calcule leurs comptages de valeurs respectifs. Ensuite, unstack et trier à la fois les indices ligne et en colonne, le cas échéant remplissage NaNs avec 0.

(df.set_index('col1').stack().groupby(level=[0,1]).value_counts().unstack(level=[1,2]) 
    .sort_index(ascending=False, axis=1).sort_index(ascending=False).fillna(0).astype(int)) 

enter image description here

Une autre solution simplifiée par commentaire par @jezrael:

(df.set_index('col1').stack().groupby(level=[0,1]).value_counts() 
    .sort_index(ascending=[False, True, False]).unstack([1,2]).fillna(0).astype(int)) 

enter image description here

En outre, vous pouvez trier l'axe de l'index dans l'ordre décroissant pour y revenir. notre o/p désiré.

+1

Je supprime le commentaire, parce que 'True'' False' est l'échange dans l'index, désolé; ( – jezrael

+1

Et belle solution, +1 – jezrael

+1

C'est parfait, merci beaucoup! –