首页 > 解决方案 > 基于条件的 Pandas 窗口平均值

问题描述

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

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

它是基于以下逻辑创建的:

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

对于用户来说b,平均时间应该是 NaN,因为他们在第一次与该功能交互之前没有访问过。

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

如果用户从未使用过新功能,则他们的平均值和计数应该是 NaN。

在此先感谢您的帮助。

标签: python-3.xpandaspandas-groupby

解决方案


尝试这个:

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)

推荐阅读