我有一个包含 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/