在此任务中,我具有带时间戳的数据帧和作为某些服务请求的服务消息,此列在短时间内具有同一消息的多个条目,因为该消息一直在生成,直到接受服务或拒绝。这是示例数据框-
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
上的消息与以前的消息有所不同,因为存在一个多小时的差异。
有办法吗?
谢谢。
答案 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