Pandas - 按时间段分组/根据多个条件删除连续的行

时间:2017-10-11 11:48:38

标签: python pandas

解决以下问题的最佳方法是什么:

我有一个Pandas数据框,如下所示:

Index  Date                  Name       Product
01     2017-09-6 18:01:15    Mike       xxx
02     2017-09-6 18:02:35    Mike       yyy
03     2017-09-6 18:07:25    Mike       xxx
04     2017-09-6 18:09:35    Mike       yyy
05     2017-09-6 18:09:39    John       yyy
06     2017-09-6 18:23:15    Mike       xxx
07     2017-09-6 18:25:35    Mike       xxx
08     2017-09-6 18:50:39    John       yyy
09     2017-09-6 18:58:15    Mary       xxx
10     2017-09-6 19:07:20    Mary       xxx
11     2017-09-6 19:07:25    Mike       zzz
12     2017-09-6 19:09:09    Mary       xxx
13     2017-09-6 21:03:45    Mary       zzz
14     2017-09-6 21:12:15    Mike       yyy
15     2017-09-6 21:20:15    Mike       yyy

此数据框表示数据库中多个用户的产品搜索。 我现在要做的是创建一个数据框,在一定时间内过滤掉同一用户在同一产品上的多次搜索(比如说15分钟) - 换句话说:在第一次搜索后的15分钟内每隔一次搜索一次搜索会议名称和产品标准应删除。

结果数据框应如下所示:

Index  Date                  Name       Product
01     2017-09-6 18:01:15    Mike       xxx
02     2017-09-6 18:02:35    Mike       yyy
05     2017-09-6 18:09:39    John       yyy
06     2017-09-6 18:23:15    Mike       xxx
08     2017-09-6 18:50:39    John       yyy
09     2017-09-6 18:58:15    Mary       xxx
11     2017-09-6 19:07:25    Mike       zzz
13     2017-09-6 21:03:45    Mary       zzz
14     2017-09-6 21:12:15    Mike       yyy

在Python中解决这个问题的最佳方法是什么?

THX& BR bdriven

1 个答案:

答案 0 :(得分:1)

我认为您需要遍历Date系列以创建过滤器。

(假设您的每个[名称,产品]组的日期列已经按升序排序。)

def date_filter(s):
    s = s.values
    anchor = s[0]
    res = [False] * len(s)
    res[0] = True

    for idx, x in enumerate(s):
        if (x - anchor) / np.timedelta64(1, 'm') > 15:
            res[idx] = True
            anchor = x

    return res

df[ df.groupby(['Name','Product'])['Date'].transform(date_filter) ]
相关问题