【问题标题】:Calculating Diff To Specific Value Within Groups计算组内特定值的差异
【发布时间】:2018-05-22 23:12:12
【问题描述】:

我需要计算数千个模拟实验的组内差异。这是数据的简化版本:

import pandas as pd

data = {
    'experiment':['exp_1','exp_1','exp_1','exp_2','exp_2','exp_3','exp_3','exp_3','exp_3'],
    'variation':['control','variation_1','variation_2','control','variation_1','control','variation_1','variation_2','variation_3'],
    'revenue': [100,120,155,50,95,300,500,350,610]
}
df = pd.DataFrame(data,columns=['experiment','variation','revenue'])

In [16]: df
Out[16]:
  experiment    variation  revenue
0      exp_1      control      100
1      exp_1  variation_1       90
2      exp_1  variation_2      155
3      exp_2      control       50
4      exp_2  variation_1       95
5      exp_3      control      300
6      exp_3  variation_1      500
7      exp_3  variation_2      250
8      exp_3  variation_3      610

请注意,每个实验没有固定数量的变体 - 可能只有 A/B 测试或 A/B/C/D 测试。

目标是通过将每个变体与每个实验中的对照进行比较来计算差异。这将为示例数据提供以下结果:

In [17]: df
Out[17]:
  experiment    variation  revenue  diffs
0      exp_1      control      100    NaN
1      exp_1  variation_1       90    -10
2      exp_1  variation_2      155     55
3      exp_2      control       50    NaN
4      exp_2  variation_1       95     45
5      exp_3      control      300    NaN
6      exp_3  variation_1      500    200
7      exp_3  variation_2      250    -50    
8      exp_3  variation_3      610    310

This answer 确实很接近,但它是每个时间点的累积差异,而不是与每个组中的第一个值进行比较。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    IIUC,我们可以使用transformfillna

    df['diff']=np.nan
    
    df['diff']=df.loc[df.variation!='control','diff'].\
                    fillna(df.revenue-df.groupby('experiment').revenue.transform('first'))
    df
    Out[498]: 
      experiment    variation  revenue   diff
    0      exp_1      control      100    NaN
    1      exp_1  variation_1       90  -10.0
    2      exp_1  variation_2      155   55.0
    3      exp_2      control       50    NaN
    4      exp_2  variation_1       95   45.0
    5      exp_3      control      300    NaN
    6      exp_3  variation_1      500  200.0
    7      exp_3  variation_2      250  -50.0
    8      exp_3  variation_3      610  310.0
    

    【讨论】:

      【解决方案2】:

      我能够通过创建一个仅包含变化 == 控制的行的新数据框,然后将其外部合并回原始数据框并减去结果列来实现这一点。

      controls = df[df.variation == 'control'][['experiment','revenue']]
      merged = pd.merge(controls,df,on='experiment',how='outer',suffixes=['_control',''])
      df['diffs'] = merged['revenue'] - merged['revenue_control']
      

      【讨论】:

        猜你喜欢
        • 2014-01-06
        • 2016-10-30
        • 2015-04-07
        • 1970-01-01
        • 2023-02-13
        • 2015-03-26
        • 2017-06-25
        • 2019-02-17
        • 1970-01-01
        相关资源
        最近更新 更多