我有两个数据框,其中一个事件可能会或可能不会触发操作。另一个用一个字段表示动作,以显示触发动作的内容。我的目标是尽可能多地触发动作持续时间。
键不在我的控制之下,并且不是完全相等的连接,其中找到一个且仅一个匹配。我虽然是做连接然后删除负持续时间因为我知道触发器必须在动作之前。然后我需要除去每个键的最低持续时间。请参阅示例代码。我想在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'