场景
我有一个具有给定结构的数据帧,最后总结一下,我想找出服务的响应和请求之间的时间差。 它包含以下列:
数据示例为:
Timestamp Service Command Message_Type Message_ID
12:00:00 FoodOrders SeeStock() Request 125
12:00:02 FoodOrders SeeStock() Response 125
输出必须类似于
Service Command Message_ID TimeDiff
FoodOrders SeeStock 125 00:00:02
我有什么想法
通过Service,Command,Message_ID进行分组,并添加具有某些计算时间差的功能的附加列。
我的实际问题
谢谢。
答案 0 :(得分:1)
该计划或多或少都可以。请注意,为了提高效率,最好不要直接传递lambda函数来计算自定义聚合(如TimeDiff)。最好先计算可以使用pandas / numpy内置函数完成的辅助聚合,然后基于这些辅助聚合计算自定义聚合。
答案 1 :(得分:1)
此code之后是另一篇文章:
import time
start = time.time()
print("hello")
end = time.time()
print(end - start)
您可以自己测量时间。
尝试您的方法和lambda进行测试。
答案 2 :(得分:1)
如果您使用Jupiter Notebook,则可以尝试以下操作:
%timeit df.sort_values('Time').groupby(['Service', 'Command', 'Message_Type', 'Message_ID']).apply(lambda x: x.iloc[1]['Time'] - x.iloc[0]['Time'])
在我的样本中,我有这个信息:
2.97 ms ± 310 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
我也认为这是一个好计划=
答案 3 :(得分:1)
如果性能很重要,请避免聚合和分组,因为用MultiIndex创建Response
和Response
系列并减掉Timestamp
s会很慢,sort_index
也应该有帮助表现:
#if necessary
#df['Timestamp'] = pd.to_timedelta(df['Timestamp'])
cols = ['Service','Command','Message_ID']
s1 = df[df['Message_Type'] == 'Response'].set_index(cols)['Timestamp'].sort_index()
s2 = df[df['Message_Type'] == 'Request'].set_index(cols)['Timestamp'].sort_index()
df1 = s1.sub(s2).reset_index()
print (df1)
Service Command Message_ID Timestamp
0 FoodOrders SeeStock() 125 00:00:02