我有一个数据帧,如下所示:
Bookin_ID Session Walkin
1 S1 no
2 S1 no
3 S1 no
4 S1 yes
5 S1 no
6 S1 yes
10 S2 no
11 S2 yes
12 S2 no
13 S2 yes
14 S2 no
15 S2 yes
16 S2 no
17 S2 no
18 S2 yes
19 S2 no
26 S3 no
27 S3 no
28 S3 yes
29 S3 no
根据以上内容,我想计算每个会话的步行概率,如下所示:
walkin_prob = count of walkin = 'yes' in that session / total number of booking in that session
例如,对于Session=S1,Walkin=no的计数为2,预订的总数为6,因此Walkin_prob=2/6=0.33。
类似地,对于S2,Walkin=yes的计数为4,预订的总数为10,因此Walkin_prob=4/10=0.4。等等
预期输出:
Bookin_ID Session Walkin walkin_prob
1 S1 no 0.33
2 S1 no 0.33
3 S1 no 0.33
4 S1 yes 0.33
5 S1 no 0.33
6 S1 yes 0.33
10 S2 no 0.33
11 S2 yes 0.4
12 S2 no 0.4
13 S2 yes 0.4
14 S2 no 0.4
15 S2 yes 0.4
16 S2 no 0.4
17 S2 no 0.4
18 S2 yes 0.4
19 S2 no 0.4
26 S3 no 0.25
27 S3 no 0.25
28 S3 yes 0.25
29 S3 no 0.25
我在下面试过了,但没有用。
df['walkin_prob'] = df.groupby('Session')[['Walkin'] == 'yes'].sum()/df.groupby('Session')['Walkin'].sum()
下面显示错误
未找到列:错误
您可以使用transform
来执行此操作:
df['walkin_prob'] = df.groupby('Session')['Walkin'].transform(lambda x: x[x == 'yes'].count() / x.count())
当从transform
中的函数返回单个值时,它将为组中的每一行使用该值。以上内容将给出准确的预期输出。
你差不多到了。只是[['Walkin'] == 'yes']
不是正确的记数法。它的计算结果为False
(不是列(。
您可以使用.loc
在df['Walkin'] == 'yes'
:上进行过滤
df.loc[df['Walkin'] == 'yes'].groupby('Session').sum() / df.groupby('Session').sum()
walkin_prob
Session
S1 0.333333
S2 0.407125
S3 0.250000