使用Python Pandas匹配两DataFrame的time列并关联对应行数据
解决DataFrame时间列近邻匹配并关联数据的方案
这是个非常常见的时间序列数据匹配需求,用pandas的merge_asof函数就能高效搞定,完全不用逐行遍历(那对5万+2万的数据量来说会慢到离谱)。下面是具体的步骤和代码:
核心思路
merge_asof是pandas专门为按键的最近邻匹配设计的工具,它会先对两个DataFrame按匹配键排序,然后快速为右表(这里是df2)的每一行在左表(df1)中找到最接近的键值,再把对应行的所有列合并过来。
具体步骤
1. 先对两个DataFrame按'time'列排序
merge_asof要求两个表必须按匹配的键(也就是'time')排序,这是前提:
import pandas as pd # 对df1和df2按time列排序,重置索引避免原索引干扰 df1_sorted = df1.sort_values('time').reset_index(drop=True) df2_sorted = df2.sort_values('time').reset_index(drop=True)
2. 执行近邻匹配合并
用direction='nearest'参数指定找最接近的time值:
# 合并df2和df1,匹配最接近的time,保留df2的所有行并关联df1的对应列 result_df = pd.merge_asof( df2_sorted, df1_sorted, on='time', direction='nearest' )
参数说明
on='time':指定用来匹配的列名direction='nearest':寻找与df2的time值最接近的df1的time值(不管是比它大还是小)。如果需要只找不大于df2 time的最近值,用direction='backward';只找不小于的用direction='forward'
效果示例
举个简单的小例子帮你理解:
假设df1是:
| time | vel | yaw |
|---|---|---|
| 66 | 15 | 25 |
| 70 | 20 | 30 |
df2是:
| time | other_data |
|---|---|
| 67 | sample1 |
执行合并后,result_df会变成:
| time | other_data | vel | yaw |
|---|---|---|---|
| 67 | sample1 | 15 | 25 |
完全符合你要的“把df1对应行的vel、yaw关联到df2对应行”的需求。
额外注意点
- 如果你的'time'列是datetime类型(比如
YYYY-MM-DD HH:MM:SS),这个方法同样适用,只要确保列是datetime64格式即可,不需要额外转换。 - 这个方法的时间复杂度是O(M log N),比逐行遍历的O(M*N)效率高太多,处理你的5万+2万数据量完全没问题。
内容的提问来源于stack exchange,提问作者ankushbraj
相关产品推荐
相关产品推荐

