我对Python(Pandas)还不是很熟悉,请帮助我解决这个问题
我的数据框看起来像这样:- Device_id 是设备的ID,该设备在时间(1524724677)显示一个消息(Msg),时间是以纪元时间表示的。
Device_Id Msg Time0 ABC123 connected 15247246771 ABC123 connected 15247246792 XYZ123 device failed 15247248143 ABC123 connected 15247252794 XVZ123 device failed 15247253005 PQR123 error 15247253256 ABC123 connected 1524725345
我需要对数据框的每一行进行操作,以便添加一些新的列。
我想要的数据框看起来像这样:
Device_Id Msg Time count0 ABC123 connected 1524724677 11 ABC123 connected 1524724679 22 XYZ123 device failed 1524724814 13 ABC123 connected 1524725279 14 XVZ123 device failed 1524725300 15 PQR123 error 1524725325 16 ABC123 connected 1524725345 2
这个计数列的工作原理如下:
请阅读所有要点以清楚了解计数列的工作原理
--对于第0行,计数为1,因为这是唯一设备--我们将根据时间增加计数器--每10分钟我们将重置计数器值--对于第1行,计数为2,因为时间(1524724679)在1524724677和1524724677 + 10分钟之间。--对于第2行,它是唯一设备且时间(1524724679)在1524724677和1524724677 + 10分钟之间,所以计数为1。--对于第3行,请注意它不是唯一设备,但计数仍为1,因为时间(1524725279)不在1524724677和1524724677 + 10分钟之间。(计数重置)--对于第4列,计数为1,因为时间(1524725300)在1524725279和1524725279 + 10分钟之间。--对于第5列,计数为1,是唯一设备且时间(1524725325)在1524725279和1524725279 + 10分钟之间。--对于第6列,计数为2,因为时间(1524725345)在1524725279和1524725279 + 10分钟之间。
计数值将在每10分钟重置,这意味着每个device_id的计数将从1开始。
每10分钟后,每个唯一的device_id将被视为新的,因此计数将从1重新开始,并在接下来的10分钟内保持其值。
回答:
你可以使用groupby和grouper
函数轻松解决这个问题:
# 转换时间df['Time'] = pd.to_datetime(df['Time'], unit='s')# 获取输出df['count'] = df.groupby(['Device_Id', pd.Grouper(key='Time', freq='10min')]).cumcount()+1print(df) Device_Id Msg Time count0 ABC123 connected 2018-04-26 06:37:57 11 ABC123 connected 2018-04-26 06:37:59 22 XYZ123 device failed 2018-04-26 06:40:14 13 ABC123 connected 2018-04-26 06:47:59 14 XVZ123 device failed 2018-04-26 06:48:20 15 PQR123 error 2018-04-26 06:48:45 16 ABC123 connected 2018-04-26 06:49:05 2