首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何让连续3周或更长时间的用户使用熊猫?

如何让连续3周或更长时间的用户使用熊猫?
EN

Stack Overflow用户
提问于 2022-11-16 08:28:34
回答 2查看 58关注 0票数 1

我有一个这样的用户表,

代码语言:javascript
运行
AI代码解释
复制
    USERID  Week_Number  Year
0       fb          5.0  2021
1  twitter          1.0  2021
2  twitter          2.0  2021
3  twitter          3.0  2021
4  twitter          1.0  2022
5  twitter          2.0  2022
6  twitter          3.0  2022
7  twitter         15.0  2022
8  twitter          NaN   NaN
9    human         21.0  2022

我想找到在同一年连续3周登录>=的用户。每一年的周数都是独一无二的。例如,在上表中,我们可以看到用户twitter登录在2022年的week_no: 1,2,3中,从而满足了我正在寻找的条件。

我想要的输出,

代码语言:javascript
运行
AI代码解释
复制
USERID        Year
twitter       2021
twitter       2022

您可以使用

代码语言:javascript
运行
AI代码解释
复制
import pandas as pd
import numpy as np

data = pd.DataFrame({"USERID": ["fb", "twitter", "twitter", "twitter", "twitter", "twitter", "twitter", "twitter", "twitter", "human"],
                     "Week_Number": [5, 1, 2, 3, 1, 2, 3, 15, np.nan, 21],
                     "Year": ["2021", "2021","2021","2021", "2022", "2022", "2022", "2022", np.nan, "2022"]})

有人能帮我实现这个要求的输出吗?我试过很少的东西,但无法得到适当的输出。

代码语言:javascript
运行
AI代码解释
复制
for ix, group in data.groupby([data.USERID, data.Year]):
    group = group.sort_values("Week_Number")
    group["Diff"] = (group.Week_Number - group.Week_Number.shift(1)).fillna(1)
    break

谢谢你提前提供帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-11-16 11:12:29

由于您对至少三个星期的运行(开始或结束)的详细信息不感兴趣,而只对用户连续使用至少三个星期的元组(user, year)感兴趣,所以非常简单:

代码语言:javascript
运行
AI代码解释
复制
def min_consecutive(w, minimum_run=3):
    dy = w.diff() != 1
    runlen = dy.groupby(dy.cumsum()).size()
    return (runlen >= minimum_run).any()

s = (
    data
    .sort_values('Week_Number')
    .groupby(['USERID', 'Year'])['Week_Number']
    .apply(min_consecutive)
)
>>> s[s]
USERID   Year
twitter  2021    True
         2022    True
Name: Week_Number, dtype: bool

解释

我们考虑每一组(user, year)。在这组中,我们观察到一个(有序的,没有重复的)周数序列。这可以是[1,2,3,12,13,18,19,20,21] (运行3,运行2,运行4)。系列dy显示了运行中存在的空白(例如,上面假设的值:[T,F,F,T,F,T,F,F,F])。我们使用它的.cumsum()使每个组连续运行,例如[1,1,1,2,2,3,3,3,3]。我们取每个组的size (例如[3,2,4]),并返回True当且仅当其中任何一个都是minimum_run长的。

增编:查找符合标准的周数

以下是一些想法,取决于您希望如何输出。

代码语言:javascript
运行
AI代码解释
复制
df = data.dropna().sort_values(['USERID', 'Year', 'Week_Number'])
df = df.assign(rungrp=(df.groupby(['USERID', 'Year'])['Week_Number'].diff() != 1).cumsum())
df = df.loc[df.groupby('rungrp')['rungrp'].transform('count') >= 3]
>>> df
    USERID  Week_Number  Year  rungrp
1  twitter          1.0  2021       3
2  twitter          2.0  2021       3
3  twitter          3.0  2021       3
4  twitter          1.0  2022       4
5  twitter          2.0  2022       4
6  twitter          3.0  2022       4

所有这几个星期都是至少3周的一部分。

分组以查找每一次运行的周、分钟和最大值:

代码语言:javascript
运行
AI代码解释
复制
>>> df.groupby(['USERID', 'Year', 'rungrp'])['Week_Number'].agg([min, max])
                     min  max
USERID  Year rungrp          
twitter 2021 3       1.0  3.0
        2022 4       1.0  3.0
票数 2
EN

Stack Overflow用户

发布于 2022-11-16 08:55:58

与循环不同,您可以创建一个列,该列将显示用户在一年中是否已连续增长,然后检查该列在一年中是否每个用户超过3:

代码语言:javascript
运行
AI代码解释
复制
data.sort_values(by=['USERID','Year','Week_Number'],ascending=True,inplace=True)

data.assign(
    grouped_increase = data.groupby([data.USERID, data.Year])["Week_Number"]
    .diff()
    .gt(0)
    .astype(int)
).groupby([data.USERID, data.Year])["grouped_increase"].sum().reset_index().query(
    "grouped_increase >= 3"
).drop(
    "grouped_increase", axis=1
)

代码语言:javascript
运行
AI代码解释
复制
    USERID  Year
3  twitter  2022

基于您的评论,使用此DF

代码语言:javascript
运行
AI代码解释
复制
     USERID  Week_Number    Year
8        fb          2.0  2021.0
9        fb          3.0  2021.0
10       fb          4.0  2021.0
0        fb          5.0  2021.0
11       fb          2.0  2022.0
12       fb          3.0  2022.0
13       fb          4.0  2022.0
14       fb          5.0  2022.0
7     human         21.0  2022.0
1   twitter          1.0  2021.0
2   twitter          1.0  2022.0
3   twitter          2.0  2022.0
4   twitter          3.0  2022.0
5   twitter         15.0  2022.0
6   twitter          NaN     NaN

运行上述代码将提供:

代码语言:javascript
运行
AI代码解释
复制
    USERID    Year
0       fb  2021.0
1       fb  2022.0
4  twitter  2022.0
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74464008

复制
相关文章

相似问题

领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文