如何使用merge_asof实现两个DataFrame按name精确匹配、time区间匹配合并
你调用pd.merge_asof失败是因为参数使用错误:on参数仅支持传入单个用于容差匹配的有序列(数值/时间类型),需要完全匹配的name字段需要通过by参数传入,不能放在on列表中。
正确实现步骤
- 首先必须保证两个DataFrame都按【完全匹配字段 + 容差匹配字段】升序排序,这是
merge_asof的强制要求 - 调用方法时分别指定
by和on参数即可
代码示例
import pandas as pd import numpy as np # 构造示例数据 a = pd.DataFrame(np.reshape(range(25), (5,5))) b = pd.DataFrame(np.reshape(range(25), (5,5))) a['name'] = ['a', 'b', 'c', 'c','d'] b['name'] = ['a', 'b', 'b', 'c','d'] # 假设列4为要做容差匹配的时间列,先转为datetime类型 a[4] = pd.to_datetime(a[4], unit='ms') b[4] = pd.to_datetime(b[4], unit='ms') # 对两个表按规则排序 a = a.sort_values(['name', 4]).reset_index(drop=True) b = b.sort_values(['name', 4]).reset_index(drop=True) # 执行合并 merge_result = pd.merge_asof( left=a, right=b, by='name', # 指定完全匹配的字段 on=4, # 指定容差匹配的时间字段 tolerance=pd.Timedelta('200ms'), direction='nearest', suffixes=['', '_x'] )
如果你的容差匹配字段是数值类型,直接把tolerance设置为对应的数值即可,比如允许数值差2就设置tolerance=2。
内容的提问来源于stack exchange,提问作者nick
相关产品推荐
相关产品推荐

