J'ai un df tel que:

 Service |  DoorDash | Grubhub / Seamless | UberEats| Caviar | Postmates | JustEat | Deliveroo | Foodora | Grab | Talabat | Tock      
 Open         True          True                True     False    True        False     False      False     False  False     False
 Closed       True          False               True     True     False       False     False      False     False  False     True
 Open         True          False               False    False    False       False     False      False     False  False     False
 Open         False         False               False    False    False       False     False      False     False  False     False
 Closed       False         False               False    True     False       False     False      False     False  False     True
 Open         False         False               False    False    False       False     False      False     False  False     False
 Closed       False         False               False    False    False       False     False      False     False  False     True  
 Closed       True          True                True     False    True        False     False      False     False  False     False
 Open         False         True                True     False    False       False     False      False     False  False     False

Je veux exécuter un .value_counts(normalize=True) sur toutes les colonnes non nommées Service mais regroupées par la colonne de service, donc ma sortie sera le % que DoorDash et le reste des colonnes sont True et False mais regroupés ou filtrés pour Open ou Fermé dans la colonne Service.

Production attendue:

    DoorDash Grubhub / Seamless ........
Open   .60        .50
Closed .40        .50

Mais pour toutes les colonnes avec une valeur True ou False, pas seulement DoorDash, mais je n'arrive pas à trouver un moyen de faire ce calcul et ma sortie sera pour toutes les colonnes ?

Merci

1
Chris90 9 nov. 2020 à 10:31

1 réponse

Meilleure réponse

Vous pouvez utiliser DataFrame.melt avec SeriesGroupBy.value_counts :

df = (df.melt('Service')
        .groupby(['Service', 'variable'])['value']
        .value_counts(normalize=True)
        .unstack(1, fill_value=0))
print (df)
variable       Caviar  Deliveroo  DoorDash  Foodora  Grab  Grubhub / Seamless  \
Service value                                                                   
Closed  False     0.5        1.0       0.5      1.0   1.0                0.75   
        True      0.5        0.0       0.5      0.0   0.0                0.25   
Open    False     1.0        1.0       0.6      1.0   1.0                0.60   
        True      0.0        0.0       0.4      0.0   0.0                0.40   

variable       JustEat  Postmates  Talabat  Tock  UberEats  
Service value                                               
Closed  False      1.0       0.75      1.0  0.25       0.5  
        True       0.0       0.25      0.0  0.75       0.5  
Open    False      1.0       0.80      1.0  1.00       0.6  
        True       0.0       0.20      0.0  0.00       0.4  
1
jezrael 10 nov. 2020 à 07:37