【问题标题】:Pandas GroupingBy and finding repetition by unique IDsPandas GroupingBy 并通过唯一 ID 查找重复
【发布时间】:2018-08-11 17:54:44
【问题描述】:

我有一个这样的数据框:

    userId  date    new doa
67  23  2018-07-02  1   2
68  23  2018-07-03  1   3
69  23  2018-07-04  1   4
70  23  2018-07-06  1   6
71  23  2018-07-07  1   7
72  23  2018-07-10  1   10
73  23  2018-07-11  1   11
74  23  2018-07-13  1   13
75  23  2018-07-15  1   15
76  23  2018-07-16  1   16
77  23  2018-07-17  1   17
......
194605  448053  2018-08-11  1   11
194606  448054  2018-08-11  1   11
194607  448065  2018-08-11  1   11

df['doa'] 代表出场日。

现在我想知道每天出现哪些独特的userIds。就像userIds 出现在第 1 天、第 2 天、第 3 天等等。那么我该如何准确地groupby他们呢?我也想知道平均值。一个月内独立用户打开应用的天数?

最后我还想知道哪些用户在整个月中每天至少出现一次。

我想要这样的东西:

userId  week_no ndays 
 23        1     2     
 23        2     5
 23        3     6
.....
 1533      1     0
 1534      2     1
 1534      3     4
 1534      4     1
 1553      1     1
 1553      2     0
 1553      3     0
 1553      4     0   

等等。 ndays 表示没有。一周中的天数。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    你问了几个不同的问题,没有一个特别难,它们只需要几个 groupbys 和聚合操作。

    设置

    df = pd.DataFrame({
        'userId': [1,1,1,1,1,2,2,2,2,3,3,3,3,3],
        'date': ['2018-07-02', '2018-07-03', '2018-08-04', '2018-08-05', '2018-08-06',
        '2018-07-02', '2018-07-03', '2018-08-04', '2018-08-05', '2018-07-02', '2018-07-03',
        '2018-07-04', '2018-07-05', '2018-08-06']
    })
    
    df.date = pd.to_datetime(df.date)
    df['doa'] = df.date.dt.day
    
        userId       date  doa
    0        1 2018-07-02    2
    1        1 2018-07-03    3
    2        1 2018-08-04    4
    3        1 2018-08-05    5
    4        1 2018-08-06    6
    5        2 2018-07-02    2
    6        2 2018-07-03    3
    7        2 2018-08-04    4
    8        2 2018-08-05    5
    9        3 2018-07-02    2
    10       3 2018-07-03    3
    11       3 2018-07-04    4
    12       3 2018-07-05    5
    13       3 2018-08-06    6
    

    问题

    1. 如何找到每天的唯一身份访问者?

    您可以使用groupbyunique

    df.groupby([df.date.dt.month, 'doa']).userId.unique()
    
    date  doa
    7     2      [1, 2, 3]
          3      [1, 2, 3]
          4            [3]
          5            [3]
    8     4         [1, 2]
          5         [1, 2]
          6         [1, 3]
    Name: userId, dtype: object
    
    1. 如何找到用户每月打开应用的平均天数?

    使用groupbysize

    df.groupby(['userId', df.date.dt.month]).size()
    
    userId  date
    1       7       2
            8       3
    2       7       2
            8       2
    3       7       4
            8       1
    dtype: int64
    

    这将为您提供每个唯一访问者每月访问的次数。如果你想要这个的平均值,只需申请mean

    df.groupby(['userId', df.date.dt.month]).size().groupby('date').mean()
    
    date
    7    2.666667
    8    2.000000
    dtype: float64
    
    1. 这个有点不清楚,但您似乎想要每周看到用户的天数:

    您可以groupbyuserId 以及date 列上的变体来创建连续周,从最短日期开始,然后使用size

    (df.groupby(
        ['userId', (df.date.dt.week.sub(df.date.dt.week.min())+1).rename('week_no')])
        .size().reset_index(name='ndays')
    )
    
       userId  week_no  ndays
    0       1        1      2
    1       1        5      2
    2       1        6      1
    3       2        1      2
    4       2        5      2
    5       3        1      4
    6       3        6      1
    

    【讨论】:

    • 我如何计算没有。独特的userIds 作为第一个答案中的值列表出现?就像我想用列表的长度附加一个新列。另外我想制作一个数据框,我想显示userIds 和一个频率列,按升序排序。如果可以,请附上答案
    • 如果userId 1 一周内每两天出现一次,则频率为 2/7=0.29 avg。
    猜你喜欢
    • 2020-02-10
    • 2016-07-04
    • 1970-01-01
    • 1970-01-01
    • 2012-07-21
    • 2018-10-12
    • 2021-12-07
    • 1970-01-01
    • 2018-01-05
    相关资源
    最近更新 更多