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

标签 python pandas dataframe pandas-groupby

我有一个包含 5 列的数据集,其中第一列是 visitorId,第二列是日期时间,最后一列是 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 天间隔在另一列中标记日期时间。因此,如果我在 2020-06-06、2020-06-07、2020-06-08、2020-06-18、2020-06-21 有 5 个来自 visitor123 的条目:那么 2020-06-06、2020-06- 07 和 2020-06-08 将在一个组中,因为它们都在第一个日期 (2020-06-06) 的 2 天间隔内,并分配了一个组标签 (0)。 2020-06-18 将被分配另一个组标签 (1),因为在 2020-06-18 的 2 天间隔内没有其他日期,同样,2020-06-21 将是另一个唯一的组标签 (2)。并且为新的 visitorid 重复此过程。所以我想要结束的是

|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       |

我想我可以使用 grouper,但我一直没有成功。将不胜感激一些帮助! (这是在python中完成的)

最佳答案

使用 Series.diff() + GroupBy.cumsum() ,如下:

准备:

#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

关于python - 如何按列 Id 对数据框进行分组,然后在组内标记 2 天的间隔?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66811500/

相关文章:

python - 在 Debian wheezy 上安装 python3-networkx

python - 用 Pandas 绘制时间序列的分箱计数

python - 如何取消数据框列中字典列表的嵌套

python - 条件循环橄榄球抽签的列表操作

python - CentOS/Bluehost : Attempt to Write a Readonly Database, 上的 Django 除 777 外还使用哪个 Chmod?

python Pandas : string to datetime

python - “系列”对象没有属性“values_counts”

python - 如何从列中获取日期时间类型而不是时间戳?

python - 无法识别的错误类型 : __array__( )

python - 查找存储在数据框单元格中的列表