如何根据时间戳从数据框中删除重复的条目?

时间:2020-09-03 08:18:14

标签: python-3.x pandas dataframe duplicates timestamp

在此任务中,我具有带时间戳的数据帧和作为某些服务请求的服务消息,此列在短时间内具有同一消息的多个条目,因为该消息一直在生成,直到接受服务或拒绝。这是示例数据框-

timestamp                   service message
2019-02-15 15:56:19         battery check
2019-02-15 15:56:34         battery check
2019-02-15 15:57:02         battery check
2019-02-15 15:57:30         battery check
2019-02-15 15:57:54         battery check
2019-02-15 15:59:10         battery check
2019-02-15 17:05:03         battery check
2019-02-15 17:05:42         battery check
2019-02-15 17:06:40         no network available
2019-02-15 17:06:48         no network available
2019-02-15 17:06:58         no network available
2019-02-15 17:08:31         no network available

我想在15分钟内删除所有重复项,因此可以算作一项服务。 但是简单的字符串检查不起作用,因为17:05:03上的消息与以前的消息有所不同,因为存在一个多小时的差异。 有办法吗?

谢谢。

2 个答案:

答案 0 :(得分:0)

Grouper与列service message一起用于汇总GroupBy.first

print (df.groupby([pd.Grouper(freq='15min', key='timestamp'), 'service message']).first())
                                                   timestamp
timestamp           service message                         
2019-02-15 15:45:00 battery check        2019-02-15 15:56:19
2019-02-15 17:00:00 battery check        2019-02-15 17:05:03
                    no network available 2019-02-15 17:06:40

df1 = (df.groupby([pd.Grouper(freq='15min', key='timestamp'), 
                 'service message'])
         .first()
         .reset_index(level=0, drop=True)
         .reset_index())
print (df1)
        service message           timestamp
0         battery check 2019-02-15 15:56:19
1         battery check 2019-02-15 17:05:03
2  no network available 2019-02-15 17:06:40

答案 1 :(得分:0)

我们可以简单地使用boolean masking删除重复项:

m1 = df['timestamp'].diff().le(pd.Timedelta(minutes=15))
m2 = df['service message'].duplicated() & \
     df['service message'].eq(df['service message'].shift())

df = df[~(m1 & m2)]

详细信息:

print(m1)
0     False
1      True
2      True
3      True
4      True
5      True
6     False
7      True
8      True
9      True
10     True
11     True
Name: timestamp, dtype: bool

print(m2)
0     False
1      True
2      True
3      True
4      True
5      True
6      True
7      True
8     False
9      True
10     True
11     True
Name: service message, dtype: bool

结果:

print(df)
            timestamp       service message
0 2019-02-15 15:56:19         battery check
6 2019-02-15 17:05:03         battery check
8 2019-02-15 17:06:40  no network available