基于条件的熊猫窗口平均值

时间:2019-07-24 19:24:38

标签: python-3.x pandas pandas-groupby

我正在尝试对以下熊猫数据框执行窗口操作:

import pandas as pd

df = pd.DataFrame({'visitor_id': ['a','a','a','a','a','a','b','b','b','b','c','c','c','c','c'],
                   'time_on_site' : [3,5,6,4,5,3,7,6,7,8,1,2,2,1,2],
                   'site_visit': [1,2,3,4,5,6,1,2,3,4,1,2,3,4,5],
                   'feature_visit' : [np.nan,np.nan,1,np.nan,2,3,1,2,3,4,np.nan,1,2,3,np.nan]
                  })
  

“对于每个不同的用户,计算在与功能进行交互之前他们在网站上花费的平均时间及其访问总数。”

数据由具有以下定义的四列组成:

visitor_id 是一个字符串,用于标识唯一的给定访问者

time_on_site 是他们在网站上花费的时间

site_visit 是他们访问广告的次数的递增计数器 网站。

feature_visit 是他们在网站上使用特定功能的时间的递增计数器。如果客户在与功能交互之前访问了该站点,则会生成一个NaN。如果他们访问了该站点并且未与新功能交互,则会生成NaN。他们每次访问该站点并与该功能进行交互时,计数器都会增加一。

visitor_id time_on_site site_visit feature_visit
a   3   1   NaN
a   5   2   NaN
a   6   3   1
a   4   4   NaN
a   5   5   2
a   3   6   3
b   7   1   1
b   6   2   2
b   7   3   3
b   8   4   4
c   1   1   NaN
c   2   2   1
c   2   3   2
c   1   4   3
c   2   5   NaN

预期输出应如下所示:

id   mean   count
a    4       2  
b    NaN     0
c    1       1

是根据以下逻辑创建的:

对于用户a,预期输出为4,这是site_visit 1和2的平均time_on_site,发生在site_visit 3上的第一次功能交互之前。

对于用户b,平均时间应为NaN,因为他们在首次与该功能进行交互之前没有之前的访问。

对于用户c,他们的平均时间仅为1,因为在与新功能进行交互之前,他们只有一次访问。

如果用户从未使用过新功能,则其平均值和计数应为NaN。

预先感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

尝试一下:

def summarize(x):
    index = x[x['feature_visit'].notnull()].index[0]

    return pd.Series({
        'mean': x[x.index < index]['time_on_site'].mean(),
        'count': x[x.index < index]['site_visit'].count()
    })

df.groupby('visitor_id').apply(summarize)