我在pandas中遇到这个问题
DF1(我的左连接):
Name | TimeStart | TimeEnd | Values | Order
John 12/24/2014 08:10:32 12/24/2014 08:14:21 2 1
John 12/24/2014 08:15:03 12/24/2014 08:22:49 2 2
DF2
Name | TimeStart | TimeEnd | Values
John 12/24/2014 08:12:57 12/24/2014 08:13:31 8
DF2中的TimeStart始终大于DF1中的TimeStart(这通常发生在交互期间)。为了匹配,它必须小于该个人的下一行数据。
这是我的思考过程。将行移到列以查看它们是否匹配。然后将DF2 TimeStart比较为>而不是DF1上的初始TimeStart,但小于下一行TimeStart(相同名称)。
df1.sort(['Name', 'TimeStart'], ascending=[1, 1], inplace = True)
df1['Name_R'] = df1['Name'].shift(-1)
df1['Matching Row'] = np.where((df1['Name_R'] == df1['Name']), 1, 0)
df1['Next Timestamp'] = np.where(df1['Matching Row'] == 1, df1['TimeStart'].shift(-1), np.datetime64('nat'))
df1['test'] = np.where(df2['TimeStart'] > df1['TimeStart'] < df1['Next Timestamp'], 1, 0)
编辑 - 是否可以使用asof命令执行此操作?唯一的技巧是Name必须匹配,然后我们在每个文件/数据帧上查找TimeStart的最接近的时间戳。
答案 0 :(得分:1)
有一个"asof join" in pandas 0.19。对于您的示例,只需忽略开始时间并按最近结束时间加入。
pd.merge_asof(DF1, DF2, on='TimeEnd')