这似乎是一项非常简单的任务,但我一直在苦苦挣扎。
我想计算(每天使用PageView == 1的会话数)/(会话总数),以下示例数据
session_df
Date/Timestamp Session ID PageViews
2/14/2016 a 1
2/14/2016 b 5
2/14/2016 c 8
3/23/2016 d 1
3/23/2016 e 1
3/23/2016 f 2
和预期的输出:
Date/Timestamp BounceRate
2/14/2016 0.333333333
3/23/2016 0.666666667
我首先尝试根据PageViews编号添加Bounced?
列,然后分组并计算百分比,然后我需要过滤掉bounced?==False
这非常繁琐。如果有人能提出更好的方法来做到这一点那就太棒了!
sessions_df['Bounced?'] = sessions_df['PageViews']>1
dt = pd.DatetimeIndex(sessions_df['Date/Timestamp'])
daily_session_bounce_rate = sessions_df.groupby([dt.date, 'Bounced?']).agg({'Session ID':'count'})
daily_session_bounce_rate = daily_session_bounce_rate.groupby(level=0).apply(lambda x: x / float(x.sum()))
daily_session_bounce_rate
# this is my output
Bounced? Session ID
2016-01-01 False 0.459893
True 0.540107
#filter data
daily_session_bounce_rate.loc[daily_session_bounce_rate['Bounced?']==True,['level_0','Session ID']]
答案 0 :(得分:1)
您无需定义单独的Bounced?
列。取count
分组行PageViews==1
,并除以该日期所有行的数量,得到分数
daily_session_bounce_rate = \
df[df['PageViews']==1].groupby('Date/Timestamp').agg({'Session ID':'count'}) /\
df.groupby('Date/Timestamp').agg({'Session ID':'count'})
答案 1 :(得分:0)
你可以尝试这样:
bouncerate = (df.loc[df['PageViews'] == 1]
.groupby('Date/Timestamp')['Session ID'].count()
.div(df.groupby('Date/Timestamp')['Session ID']
.count())
.to_frame('Bounce Rate'))
或者:
bouncerate = (df.groupby('Date/Timestamp')
.apply(lambda x: sum(x.PageViews == 1) / x.PageViews.count())
.to_frame('Bounce Rate'))
两者都导致:
>>> bouncerate
Bounce Rate
Date/Timestamp
2/14/2016 0.333333
3/23/2016 0.666667
答案 2 :(得分:0)
你需要:
grp = session_df.groupby(session_df['Date/Timestamp'].dt.day)['Session_ID'].count()
session_1 = session_df.loc[session_df['PageViews']==1].groupby(session_df['Date/Timestamp'].dt.day)['Session_ID'].count()
pd.DataFrame({'bouncerate':list(session_1/grp)}, index=session_df['Date/Timestamp'].unique())
输出:
bouncerate
2016-02-14 0.333333
2016-03-23 0.666667
答案 3 :(得分:0)
sessions_df['bounced?'] = sessions_df['PageViews']==1
daily_session_bounce_rate = sessions_df.groupby('Date/Timestamp').mean()['bounced?']
第一行根据PageViews
是否等于1创建一列。这与你的做法相反;当bounced?
超过1时,您True
为PageViews
...如果我理解您正确使用“退回”,那么用户没有' t 反弹。
第二行按Date/Timestamp
分组然后取平均值。每当你用这样的布尔值进行数学运算时,Python会将它们转换为int,所以每当有人反弹时,那就是True / 1,而每当有人反弹时,那就是False / 0。因此,作为int的布尔值的总和与True的计数相同。当你告诉熊猫取一系列布尔值的均值时,它取真值的和/数,除以值的总数,这与找到你有真实次数的百分比相同。
因此,按日期分组并取均值会为您提供一个数据框,其中行是日期,列是该日期的平均值。结果数据框的原始数据框的每一列都有一列(在这种情况下,您有一个列,其中包含每个日期的平均PageViews
,以及每个日期的平均bounced?
列。如果您只想要跳出百分比,则可以使用['bounced?']