我需要计算数千个模拟实验的组内差异。以下是数据的简化版本:
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非常接近,但它是每个时间点的累积差异,而不是与每个组中的第一个值进行比较。
答案 0 :(得分:0)
IIUC,我们可以使用for i in range(8):
df['Entity_Types_{}'.format(i)] = df.Entity_Types.str.count(str(i))
和transform
fillna
答案 1 :(得分:0)
我能够通过创建一个仅包含变量==控制的行的新数据帧,然后将其外部合并回原始数据帧并减去结果列来实现此目的。
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']