我有两个时间戳数据的数据框。我想选择所有值,其中两个数据帧的时间戳差异小于某个阈值。
例如,数据帧1和2看起来像这样,除了具有不同、不可预测的时钟值:
clock head px py pz qw
0 0.000000 -0.316579 0.119198 0.149585 0.271688 0.987492 -0.002514
1 0.200000 -0.316642 0.119212 0.149593 0.271678 0.987487 -0.002522
2 1.200000 -0.316546 0.119199 0.149585 0.271669 0.987495 -0.002507
clock head px py pz qw
0 0.010000 -0.316579 0.119198 0.149585 0.271688 0.987492 -0.002514
1 1.1040000 -0.316642 0.119212 0.149593 0.271678 0.987487 -0.002522
2 2.4030000 -0.316546 0.119199 0.149585 0.271669 0.987495 -0.002507
假定阈值为0.1,生成的数据框如下:
clock head1 head2 px1 px2 ...
0 0.000000 -0.316579 -0.316579 0.119198 0.119198 ...
1 1.200000 -0.316546 -0.316642 0.119199 0.119212 ...
我的当前方法是:在两个数据框中创建一个相同的“填充”列,根据此列进行合并(创建一个长度为len(dataframe1)*len(dataframe2)的数据框),然后按照我想要的列进行筛选:
#rename the dataframe keys so that they are different
dataframe1.columns = [i+str(1) for i in dataframe1.columns.values]
dataframe1['filler'] = 0
dataframe2.columns = [i+str(2) for i in dataframe2.columns.values]
dataframe2['filler'] = 0
# merge requires a column to merge on, so merge on the filler
df_merged = dataframe1.merge(dataframe2,on='filler',how='left')
#pick out only the rows with the time differences within the threshold
mask = (df_merged[keyword+str(1)]<= df_merged[keyword+str(2)]+threshold) & (df_merged[keyword+str(1)]> df_merged[keyword+str(2)]-threshold)
df_merged = df_merged[mask]
#delete the filler column
del df_merged['filler']
#reindex the dataframe
df_merged.index = arange(0, len(df_merged))
这样做非常快,并且给我想要的输出,但是创建一个“填充”列然后再删除它感觉很愚蠢。我想知道是否有更明显的解决方案我错过了。
在“关键字”列上合并不能给我想要的结果,只有在时间完全相同且没有时间差阈值的情况下才会产生完整数据的数据框。