4 votes

Mettre à jour certaines colonnes d'un cadre de données de manière dynamique

J'ai un cadre de données comme ci-dessous :

channel name     conv_perc
 FTV_FB_VID       0.038069 
 FB_DISP_VID      0.139276
 FTV_FB_DISP_VID  0.033426
 DISP             0.056639 
 FTV_DISP         0.084494

Je cherche à partager channel name sur _ et créez autant de colonnes que de tokens dans la chaîne, avec les mêmes noms et mettez-les à jour avec les valeurs correspondantes dans le fichier conv_perc . Mais, la valeur en conv_perc doit d'abord être divisé par les canaux dans channel name et ensuite copié sous les colonnes.

Mon idée est de calculer les canaux uniques et de créer les colonnes au préalable ; puis d'itérer ligne par ligne et de copier la valeur de l'option conv_perc dans les seules colonnes qui sont dans des channel name cellule. Je suis incapable de le faire sans une boucle. Je suis à la recherche d'un vectorized solution.

Sortie attendue :

channel name     conv_perc   FTV    FB      VID     DISP   PTV 
 FTV_FB_VID       0.038069  0.0127 0.0127 0.0127     0      0 
 FB_DISP_VID      0.139276  0.     0.0464 0.0464    0.0464  0 
 FTV_FB_DISP_VID  0.033426  0.0084 0.0084 0.0084    0.0084  0
 DISP             0.056639                          0.0566
 FTV_DISP         0.084494  0.0422                  0.0422

Veuillez noter que les valeurs dans FTV et les autres colonnes sont divisées par la longueur résultante des tokens lorsque nous divisons les données. channel name .

3voto

jezrael Points 290608

Je crois que vous avez besoin Series.str.get_dummies avec des valeurs multiples par DataFrame.mul et diviser par sum de 1 valeurs :

df1 = df['channel name'].str.get_dummies('_')
df1 = df1.mul(df['conv_perc'], axis=0).div(df1.sum(axis=1), axis=0)
print (df1)
       DISP        FB       FTV       VID
0  0.000000  0.012690  0.012690  0.012690
1  0.046425  0.046425  0.000000  0.046425
2  0.008356  0.008356  0.008356  0.008356
3  0.056639  0.000000  0.000000  0.000000
4  0.042247  0.000000  0.042247  0.000000

Si au contraire 0 besoin d'ajouter des valeurs manquantes DataFrame.mask :

df1 = df['channel name'].str.get_dummies('_')
df1 = df1.mul(df['conv_perc'], axis=0).div(df1.sum(axis=1), axis=0).mask(df1==0)
print (df1)
       DISP        FB       FTV       VID
0       NaN  0.012690  0.012690  0.012690
1  0.046425  0.046425       NaN  0.046425
2  0.008356  0.008356  0.008356  0.008356
3  0.056639       NaN       NaN       NaN
4  0.042247       NaN  0.042247       NaN

Ensuite, si vous avez besoin d'ajouter à l'original, utilisez DataFrame.join :

df = df.join(df1)
print (df)
      channel name  conv_perc      DISP        FB       FTV       VID
0       FTV_FB_VID   0.038069       NaN  0.012690  0.012690  0.012690
1      FB_DISP_VID   0.139276  0.046425  0.046425       NaN  0.046425
2  FTV_FB_DISP_VID   0.033426  0.008356  0.008356  0.008356  0.008356
3             DISP   0.056639  0.056639       NaN       NaN       NaN
4         FTV_DISP   0.084494  0.042247       NaN  0.042247       NaN

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