我有以下代码按年龄计算转化率(“转化”列具有两个值1,分别表示转化成功和0失败)。但是我想知道是否有更“优雅”的方式来做到这一点?
import pandas as pd
import numpy as np
np.random.seed(30)
### MAKE PSEUDODATA
start_date,end_date = '1/1/2015','12/31/2018'
date_rng = pd.date_range(start= start_date, end=end_date, freq='D')
length_of_field = date_rng.shape[0]
df = pd.DataFrame(date_rng, columns=['date'])
df['age'] = np.random.randint(18,100,size=(len(date_rng)))
df['conversion'] = np.random.randint(0,2,size=(len(date_rng)))
### ACTUAL CONVERSION CALCULATION
conversion_by_age = df.groupby(by='age')['conversion'].agg(['count','sum'])
conversion_by_age['rate'] = df.groupby(by='age')['conversion'].sum()/df.groupby(by='age')['conversion'].count()
print(conversion_by_age)
groupby
定义后,实际上无需执行更多次。我将使用div
运算符代替/
series / df除法。我将更改最后两行并获得相同的结果:
conversion_by_age['rate'] = conversion_by_age['sum'].div(conversion_by_age['count'])
print(conversion_by_age)
另一种方法,只取1行代码,该rate
列可以被内计算出的groupby
使用lambda
:
conversion_by_age = df.groupby(by='age').apply(lambda x: x['conversion'].sum() / x['conversion'].count())
最后,即使lambda
是一个衬板,它也比使用慢得多.div()
。这些是运行1000次的时间:
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句