大熊猫的分组比和计算比率

阿尔帕三角洲

我有以下代码按年龄计算转化率(“转化”列具有两个值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)
塞利乌斯·斯汀格(Celius Stingher)

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次的时间:

  1. 方法1时间:0.00981671929359436s +/- 0.0007387502003829031
  2. 方法2时间:0.015887546062469483 +/- 0.0014185150269994534

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章