2016-01-05 7 views
5

ここに例があります。このデータがあります。クリックスルー率の計算方法

datetime keyword COUNT 
0 2016-01-05 a_click 100 
1 2016-01-05 a_pv 200 
2 2016-01-05 b_pv 150 
3 2016-01-05 b_click 90 
4 2016-01-05 c_pv 120 
5 2016-01-05 c_click 90 

と私は、このデータに変換したいのですが

datetime keyword ctr 
0 2016-01-05 a  0.5 
1 2016-01-05 b  0.6 
2 2016-01-05 c  0.75 

私は汚いコードとデータを変換することができますが、私はそれをエレガントな方法をしたいと思います。あなたはできる

答えて

4

groupbyを使用して
df['action'] = df.keyword.str.split('_').str.get(-1) 
df['keyword'] = df.keyword.str.split('_').str.get(0) 
df = df.set_index(['datetime', 'keyword', 'action']).unstack().loc[:, 'COUNT'] 
df['ctr'] = df.click.div(df.pv) 


action    click pv ctr 
datetime keyword     
2016-01-05 a   100 200 0.50 
      b   90 150 0.60 
      c   90 120 0.75 
+0

うわー、私は 'set_index'と' unstack'を使用するように使用していませんでした!これは素晴らしいです:) 'df.reset_index()'を追加することで、私が望む構造を得ることができます! ありがとうございました – samurait

+0

よろしくお願いします! – Stefan

0

代替:

df2['key_word'] = df2.apply(lambda x: x.keyword.split('_')[0], axis=1) 
df2['key_action'] = df2.apply(lambda x: x.keyword.split('_')[1], axis=1) 


def compute_ctr(g): 
    ctr = g[g.key_action == 'click'].COUNT.values[0]/g[g.key_action == 'pv'].COUNT.values[0] 
    result = {'datetime': g.iloc[0,0], 'ctr': ctr} 
    return pd.Series(result) 


rslt = df2.groupby('key_word').apply(compute_ctr) 
rslt.reset_index(inplace=True, drop=False) 
print(rslt) 


    ctr datetime keyword 
0 0.5 5/1/2016  a 
1 0.6 5/1/2016  b 
2 0.75 5/1/2016  c 
関連する問題