我有两个表,一个事件日志和一个间隔日志。
import pandas as pd
interval_log = {'interval_id':['AG21234', 'AG21236', 'AS21234'],
'start_utc':['2016-01-01 10:30:50', '2016-03-20 09:31:50', '2016-06-20 21:12:30'],
'end_utc':['2016-01-02 12:41:00', '2016-03-20 10:12:32', '2016-06-20 23:32:21']}
interval_table = pd.DataFrame(interval_log)
event_log = {'event_id':[12334,13242, 43251, 32123, 43213, 43215, 34221],
'timestamp':['2016-01-01 10:30:51', '2016-01-01 10:31:51', '2016-01-01 10:35:51',
'2016-03-20 09:35:12', '2016-03-20 09:40:23',
'2016-06-20 22:10:30', '2016-06-20 22:21:12'],
'event_class':['A', 'B', 'A', 'C', 'B', 'D', 'A'],
'event_cause':['A1', 'B1', 'A2', 'C4', 'B34', 'D32', 'A12'] }
event_table = pd.DataFrame(event_log)
interval_table.start_utc = pd.to_datetime(interval_table.start_utc)
interval_table.end_utc = pd.to_datetime(interval_table.end_utc)
event_table.timestamp = pd.to_datetime(event_table.timestamp)
我尝试做的是将interval_id
添加到event_log
中的每个条目
目前的工作代码是:
result = []
for counter, interval in interval_table.iterrows():
subset = event_table[(event_table.timestamp > interval.start_utc) &
(event_table.timestamp < interval.end_utc) ]
subset['interval_id'] = interval.interval_id
result.append([subset])
适用于这个简单的案例但是在真实数据集中,event_log大约有900万行,而且间隔大约是300万行,它的运行效率非常低。
什么是最佳解决方案?
答案 0 :(得分:1)
我刚刚了解了from the docs所做的merge_asof
:
对于左侧DataFrame中的每一行,我们选择最后一行 右边的DataFrame,其中“on”键小于或等于左边的 键。两个DataFrame必须按键排序。
两个DataFrame必须按其键排序。
pd.merge_asof(event_table, interval_table, left_on='timestamp', right_on='start_utc')
答案 1 :(得分:1)