2017-12-08 11 views
1

何千ものシミュレートされた実験のグループ内の相違を計算する必要があります。ここで、データの簡易版である:グループ内の特定値との差を計算する

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

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 
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']