如何从Pandas Dataframe 创建%提升比较几个变体控制组?

f45qwnt8  于 2023-02-02  发布在  其他
关注(0)|答案(2)|浏览(120)

我的df看起来像这样:

segment    group        purchase_amount 
A          control      2601    
A          variant1     2608    
A          variant2     2586    
B          control      2441    
B          variant1     2712    
B          variant2     2710

我想要一个表,其中在段,我可以比较所有的变体与各自的控制。

segment    %lift        purchase_amount 
A          variant1     (2608-2601)/2601
A          variant2     (2586-2601)/2601    
B          variant1     (2712-2441)/2441    
B          variant2     (2710-2441)/2441

我怎么能对Pandas这么做呢?

q5iwbnjs

q5iwbnjs1#

您可以:

m = df['group'].eq('control')
out = df[~m].copy()
controls = out['segment'].map(df[m].set_index('segment')['purchase_amount'])
out['purchase_amount'] = (out['purchase_amount'] - controls)/(controls)

print(out)

  segment     group  purchase_amount
1       A  variant1         0.002691
2       A  variant2        -0.005767
4       B  variant1         0.111020
5       B  variant2         0.110201
kyks70gy

kyks70gy2#

您可以使用.groupby来应用该函数。

def apply_control(group):
    control = group.loc[group.group == 'control', 'purchase_amount'].values[0]
    return (group.purchase_amount - control) / control

result = df.assign(purchase_amount=(
    df
    .groupby('segment')
    .apply(apply_control)
    .reset_index(level=0, drop=True)
)).loc[df.group != 'control']

这里假设每个组中有一行的值为'control',代码的其余部分重置索引以便将其重新分配给 Dataframe ,覆盖现有的purchase_amount列,然后过滤掉控制行。
输出

segment     group  purchase_amount
1       A  variant1         0.002691
2       A  variant2        -0.005767
4       B  variant1         0.111020
5       B  variant2         0.110201

相关问题