按天计算跳出率

时间:2018-06-06 21:29:36

标签: python pandas

这似乎是一项非常简单的任务,但我一直在苦苦挣扎。

我想计算(每天使用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']]

4 个答案:

答案 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时,您TruePageViews ...如果我理解您正确使用“退回”,那么用户没有' t 反弹。

第二行按Date/Timestamp分组然后取平均值。每当你用这样的布尔值进行数学运算时,Python会将它们转换为int,所以每当有人反弹时,那就是True / 1,而每当有人反弹时,那就是False / 0。因此,作为int的布尔值的总和与True的计数相同。当你告诉熊猫取一系列布尔值的均值时,它取真值的和/数,除以值的总数,这与找到你有真实次数的百分比相同。

因此,按日期分组并取均值会为您提供一个数据框,其中行是日期,列是该日期的平均值。结果数据框的原始数据框的每一列都有一列(在这种情况下,您有一个列,其中包含每个日期的平均PageViews,以及每个日期的平均bounced?列。如果您只想要跳出百分比,则可以使用['bounced?']

对数据框进行子集化