熊猫分组通过并通过唯一ID查找重复

时间:2018-08-11 06:54:28

标签: python pandas

我有一个这样的数据框:

    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']代表出现的日子。

现在,我想找出每天出现哪些独特的userId。像第userId天出现在第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表示不可以。一周中的几天。

1 个答案:

答案 0 :(得分:0)

您要问几个不同的问题,它们都不是特别困难,它们只需要几个groupby和聚合操作即可。

设置

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. 这个还不清楚,但是您似乎想要每周看到用户的天数:

您可以groupby userId以及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