动态更新数据框的特定列

4

我有一个类似下面的数据框:

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

我希望您能够将channel name按照_进行拆分,并创建与字符串中的标记数相同的列,名称相同,并使用conv_perc中的相应值进行更新。但是,conv_perc中的值需要首先除以channel name中的通道数,然后复制到列下面。
我的想法是预先计算唯一通道并创建列;然后,逐行迭代并将conv_perc中的值复制到仅在相应的channel name单元格中的那些列中。我无法在不使用循环的情况下完成它。我要寻找一个向量化的解决方案。
预期输出:
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

请注意,FTV和其他列中的值是通过拆分“频道名称”时产生的标记长度进行除法计算的。
1个回答

3

我相信您需要使用Series.str.get_dummies处理多个值并将其与DataFrame.mul相乘,再除以1值的sum

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

如果需要添加缺失值而不是使用0,请使用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

如果需要将内容追加到原始数据中,请使用 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接