如何按列Id对数据帧进行分组,然后在组内标记2天间隔?

2024-04-29 10:01:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含5列的数据集,其中第一列是visitorId,第二列是datetime,最后一列是searchId。看起来是这样的

|visitorId | datetime  |searchId |
|:---------|:---------:|--------:|
|  123     | 2020-06-06|  abd    |     
|  123     | 2020-06-07|  cde    |        
|  123     | 2020-06-08|  dgh    |
|  123     | 2020-06-18|  sdw    |
|  123     | 2020-06-21|  hkl    |
|  345     | 2020-06-21|   dsu   |
|  456     | 2020-06-06|  sdh    |
|  456     | 2020-06-20|  ckb    |
|  456     | 2020-05-24|  etw    |

我想做的是在另一列中根据每个唯一visitorId的2天间隔标记datetimes。因此,如果我在2020-06-06、2020-06-07、2020-06-08、2020-06-18、2020-06-21上有来自visitor123的5个条目,那么2020-06-06、2020-06-07和2020-06-08将属于一个组,因为它们都在第一个日期(2020-06-06)的两天间隔内,并且分配了一个组标签(0)。2020-06-18将被分配另一个集团标签(1),因为从2020-06-18开始的两天间隔内没有其他日期,同样,2020-06-21将是另一个独特的集团标签(2)。这一过程在新的探视者身上重复。所以我想结束的是

|visitorId | datetime  | searchId | group label |
|:---------|:---------:|:--------:|------------:|
|  123     | 2020-06-06|   abd    |     0       |
|  123     | 2020-06-07|   cde    |     0       |  
|  123     | 2020-06-08|   dgh    |     0       |
|  123     | 2020-06-18|   sdw    |     1       |
|  123     | 2020-06-21|   hkl    |     2       |
|  345     | 2020-06-21|   dsu    |     0       |
|  456     | 2020-06-19|   sdh    |     0       |
|  456     | 2020-06-20|   ckb    |     0       |
|  456     | 2020-07-24|   etw    |     1       |
|  456     | 2020-08-09|   ekn    |     2       |

我想我可以用石斑鱼,但我一直没有成功。谢谢你的帮助!(这是用python完成的)


Tags: datetime间隔标签集团sdhabdcdedsu
2条回答

首先对数据帧进行排序,然后我们可以使用groupby.diff()

#df['datetime'] = pd.to_datetime(df['datetime'])
df = df.sort_values(['visitorId','datetime'])
df['group label'] = df.groupby('visitorId')['datetime'].diff().ge('2 days').astype(int)


print(df)


    visitorId   datetime   searchId  group label
1    123      2020-06-06    abd                0
2    123      2020-06-07    cde                0
3    123      2020-06-09    dgh                1
4    345      2020-06-05    dsu                0
5    345      2020-06-06    sdf                0
6    456      2020-06-06    sdh                0
7    456      2020-06-24    etw                1

编辑。

s = df.groupby('visitorId')['datetime'].diff().ge('2 days').astype(int)

df['group_label'] = np.where(
    s.gt(0),
    df.groupby(['visitorId',s]).cumcount() + 1,
    0
)

    visitorId   datetime    searchId    group label  group_label
1         123 2020-06-06     abd           0                   0
2         123 2020-06-07     cde           0                   0
3         123 2020-06-08     dgh           0                   0
4         123 2020-06-18     sdw           1                   1
5         123 2020-06-21     hkl           2                   2
6         345 2020-06-21     dsu           0                   0
7         456 2020-06-19     sdh           0                   0
8         456 2020-06-20     ckb           0                   0
9         456 2020-07-24     etw           1                   1
10        456 2020-08-09     ekn           2                   2

使用^{}+^{},如下所示:

准备:

#Convert your column 'datetime' to datetime format if not already in that format
df['datetime'] = pd.to_datetime(df['datetime'])

# sort columns
df = df.sort_values(['visitorId','datetime'])

主要逻辑:

df['group label'] = df['datetime'].diff().ge('2 days').groupby(df['visitorId']).cumsum()

结果:

print(df)

   visitorId   datetime searchId  group label
0        123 2020-06-06      abd            0
1        123 2020-06-07      cde            0
2        123 2020-06-08      dgh            0
3        123 2020-06-18      sdw            1
4        123 2020-06-21      hkl            2
5        345 2020-06-21      dsu            0
6        456 2020-06-19      sdh            0
7        456 2020-06-20      ckb            0
8        456 2020-07-24      etw            1
9        456 2020-08-09      ekn            2

相关问题 更多 >