2 votes

Comment obtenir le nombre de colonnes dont la valeur est différente de zéro dans un dataframe pandas ?

Je dispose des données suivantes :

device_id   class   Channel A   Channel B   Channel C   Channel D   Channel E   Channel F   Channel G   Channel H   Channel I   Channel J
28          S           2           4           23          45          6           6           8           9           0           0
54          P           34          56          21          0           76          45          0           0           0           0
97          S           24          45          76          0           0           35          76          87          6           20
22          V           0           0           32          76          89          0           0           0           0           0

Les canaux se présentent en groupes selon une cartographie que j'ai définie dans un dictionnaire comme suit :

Le dictionnaire :

di = {              
'S' : ['Channel A','Channel B'],                
'P' : ['Channel C','Channel D','Channel E'],                
'V' : ['Channel F','Channel G','Channel H','Channel I',' Channel J']
}

J'ai besoin de compter le nombre de chaînes regardées sur chaque appareil, ligne par ligne, à partir du dataframe pandas.

Résultat attendu :

device_id   class   Channels_S  Channels_P  Channels_V
28           S          2           3           3
54           P          2           2           1
97           S          2           1           5
22           V          0           3           0

Quelqu'un peut-il me guider dans cette démarche ?

3voto

Dark Points 20515

Voici une astuce que vous pouvez utiliser :

mask = df.set_index(['device_id','class']) != 0

d1 = mask.groupby({i:k for k,v in di.items() for i in v},axis=1).sum()

ndf = d1.add_prefix('Channel_').reset_index()

   device_id class  Channel_P  Channel_S  Channel_V
0         28     S        3.0        2.0        3.0
1         54     P        2.0        2.0        1.0
2         97     S        1.0        2.0        5.0
3         22     V        3.0        0.0        0.0

Explication :

  1. mask vous donnera un cadre de données avec des booléens dont les valeurs ne sont pas égales à zéro (true) et le reste (false). Nous définissons l'appareil et la classe comme index afin qu'ils ne soient pas pris en compte.

  2. Développer la liste à l'intérieur du dict afin de pouvoir grouper les colonnes en fonction de la clé. {i:k for k,v in di.items() for i in v}

    { 'Channel_F': 'V', 'Channel_J': 'V', 'Channel_E': 'P', 
     'Channel_G': 'V', 'Channel_D': 'P', 'Channel_B': 'S', 
     'Channel_I': 'V', 'Channel_A': 'S', 'Channel_C': 'P', 
     'Channel_H': 'V' }
  3. Grouper par axe 1, puis additionner.

  4. Ajouter un préfixe aux colonnes et réinitialiser l'index.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X