python-3.x - 基于条件的 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。
在此先感谢您的帮助。
解决方案
尝试这个:
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)
推荐阅读
- javascript - 使用 SVG 和 JS 创建 30 秒计时器显示
- python - 如何使用 python 将我的数据添加到 json 对象的开头
- mfc - 如何在 MFC MDI 应用程序上呈现关闭小工具
- c# - 如何在派生类中设置 Json.Net JsonProperty 属性的一部分而不替换基类中的 JsonProperty?
- selenoid - 硒鼓启动失败
- spring-cloud-stream - 我们可以使用 Spring Cloud 流将消息发布到 SOLACE 而不在队列/主题上配置消费者吗?
- c++ - 如果一个数字是一个回文数并且可以被它的所有数字整除
- maven - Cucumber 4 JVM 与范围报告器并行运行
- python-3.x - python在日志文件中查找匹配的字符串
- django - 如何在保存到磁盘之前验证 ImageField?