匹配多个条件的Python

匹配多个条件的Python,python,pandas,Python,Pandas,我需要在两个数据帧之间匹配多个条件,然后分配一个ID 一个标准必须是“相似或相似”且不精确,因为它涉及的时间参考稍有不同,这一事实使情况变得复杂 我需要时间戳匹配秒+/-1/2秒。然后,我想添加一列,在DF2的新列中打印ID: DF1 TimeStamp ID Size 2018-07-12T03:34:54.228000Z 46236499 0.0013 2018-07-12T03:34:54.301000Z 462365

我需要在两个数据帧之间匹配多个条件,然后分配一个ID

一个标准必须是“相似或相似”且不精确,因为它涉及的时间参考稍有不同,这一事实使情况变得复杂

我需要时间戳匹配秒+/-1/2秒。然后,我想添加一列,在DF2的新列中打印ID:

DF1
TimeStamp                     ID          Size
2018-07-12T03:34:54.228000Z   46236499    0.0013
2018-07-12T03:34:54.301000Z   46236500    0.01119422

DF2
TimeStamp                     Size         ID #new column
2018-07-12T03:34:54.292Z      0.00         blank #no match/no data
2018-07-12T03:34:54.300Z      0.01119422   46236500 #size and 
                                                    #timestamp match within tolerances
在上面的示例中,脚本将查看时间戳列,并查找DF2中具有以下信息的任何时间戳“2018-07-12T03:34:54”+/-1/2秒+具有完全相同的“大小”元素

这需要这样做,因为在整个数据集中可能有多个相同的“大小”元素


然后,它会在DF2中新创建的“ID”列中标记相应的ID,或者如果DF2被复制到新的DF,我只会在DF3中添加新的“ID”列。

根据您在最终数据帧中需要的行,您可以选择不同的联接运算符。一种解决方案使用由列大小连接的组合数据帧,然后根据合并的datetime列之间的绝对时间差过滤其余的列

df3 = df1.merge(df2, left_on='Size', right_on='Size', how='right')
df3['deltaTime'] = numpy.abs(df3['TimeStamp_x'] - df3['TimeStamp_y'])
df3 = df3[(df3['deltaTime'] < timedelta(milliseconds=500)) | pandas.isnull(df3['deltaTime'])]
如果不需要任何非合并行,只需删除
|pandas.isnull(df3['deltaTime'])
并使用内部联接即可

TimeStamp_x     ID_x    Size    TimeStamp_y     ID_y    deltaTime
0   2018-07-12 03:34:54.301     46236500.0  0.011194    2018-07-12 03:34:54.300     46236500    00:00:00.001000
1   2018-07-12 03:34:54.301     46236500.0  0.011194    2018-07-12 03:34:54.800     46236501    00:00:00.499000
3   NaT     NaN     0.000000    2018-07-12 03:34:54.292     blank   NaT