我需要在两个数据框之间匹配多个条件,然后分配一个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秒+具有完全相同的“大小”元素。
需要这样做,因为在整个数据集中可能有多个相同的“ Size”元素。
然后它将在DF2中新创建的“ ID”列中标记相应的ID,或者如果将DF2复制到新的DF,我只需在DF3中添加新的“ ID”列。
答案 0 :(得分:0)
根据最终数据框中需要的行,可以选择其他联接运算符。一种解决方案是使用由 Size 列连接的组合数据帧,然后根据合并的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'])]
输出:
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
如果您不希望合并任何行,则只需删除| pandas.isnull(df3['deltaTime'])
并使用内部联接即可。