我有两个数据框,其中一个带有可能触发或不触发动作的事件。另一个表示带有字段的操作,以显示触发操作的原因。我的目标是尽可能多地触发动作持续时间。
密钥不在我的控制之下,也不是一个完美的相等连接,只有一个匹配项。我的想法是先加入然后删除负持续时间,因为我知道触发器必须先于操作。然后我需要删除每个键的所有持续时间,但持续时间最短。请参阅示例代码。我想要 result_df 中的所有操作字段“other_data”。(仅适用于最短持续时间的连接)
我知道我的结果可能包括一些人为的短持续时间,但我怀疑由于连接键重用的性质,这种情况很少发生,并且不会对其余的分析造成问题。以前我一直在使用任意选择的最大持续时间来丢弃错误的连接数据,但是丢弃这些异常值会有问题,因为我最感兴趣的是高异常值。
import numpy as np
import pandas as pd
scale = 10000 # can go low like 1000 or high like a million just for dummmy data
trigger_df = pd.DataFrame({'seq_key' : np.random.random_integers(scale * .02,scale * .2,scale * 7),
'time_ns' : np.random.random_integers(scale * .04,scale * .4,scale * 7)})
action_df = pd.DataFrame({'seq_key' : np.random.random_integers(scale * .02,scale * .2,scale * .7),
'time_ns' : np.random.random_integers(scale * .04,scale * .4,scale * .7),
'other_data' : np.random.random_integers(scale * .03,scale * .3,scale * .7)})
action_df.drop_duplicates(cols='seq_key', take_last=True)
join_df = pd.merge(action_df,trigger_df,
on='seq_key', how='inner',
suffixes=('_action','_trigger'))
join_df['duration_ns'] = join_df.time_ns_action - join_df.time_ns_trigger
join_df = join_df[join_df.duration_ns > 0]
grouped = join_df.groupby(by = ['seq_key'])['duration_ns']
result_df = pd.DataFrame({'duration_ns' : grouped.min()}).reset_index()
print average(result_df.duration_ns)
print average(join_df.duration_ns)
print result_df ,'sad df wants other_data'