Python Pandas:为df1新增列获取符合条件的df2最小时间戳
解决方法:为df1新增匹配条件的最小timestamp2列
嘿,我来帮你搞定这个需求!要在df1里新增一列,取df2中满足col03=0且timestamp2大于当前行timestamp1的最小timestamp2,我们可以用两种高效的方式实现,下面详细说明:
方法一:用merge_asof(推荐,大数据集更高效)
merge_asof是pandas专门用于按最近键匹配的工具,属于矢量化操作,比循环快得多,适合处理大规模数据。步骤如下:
先筛选并排序df2中符合条件的行
import pandas as pd # 原始数据 d1 = {'timestamp1': [88148 , 5617900, 5622548, 5645748, 6603950, 6666502], 'col01': [1, 2, 3, 4, 5, 6]} df1 = pd.DataFrame(d1) d2 = {'timestamp2': [5629500, 5643050, 6578800, 6583150, 6611350], 'col02': [7, 8, 9, 10, 11], 'col03': [0, 1, 0, 0, 1]} df2 = pd.DataFrame(d2) # 筛选df2中col03为0的记录,并按timestamp2排序(merge_asof要求右表排序) filtered_df2 = df2[df2['col03'] == 0].sort_values('timestamp2')对df1排序后执行匹配
# merge_asof要求左表也按匹配键排序 df1_sorted = df1.sort_values('timestamp1') # 执行前向匹配:找大于当前timestamp1的最小timestamp2 result_df = pd.merge_asof( df1_sorted, filtered_df2[['timestamp2']], # 只保留需要的列 left_on='timestamp1', right_on='timestamp2', direction='forward' # forward表示取第一个大于等于左键的右键值 ) # 恢复df1原来的顺序(如果需要),并重命名新列 result_df = result_df.sort_index().rename(columns={'timestamp2': 'min_valid_timestamp2'})
执行后,result_df里的min_valid_timestamp2列就是你要的结果。如果某行timestamp1没有对应的符合条件的timestamp2,该列会显示NaN,你可以用fillna()按需填充。
方法二:用bisect+apply(小数据集友好,代码直观)
如果你的数据量不大,也可以用Python的bisect模块结合apply实现,逻辑更直观:
import bisect # 提取并排序符合条件的timestamp2列表 valid_timestamps = sorted(df2[df2['col03'] == 0]['timestamp2'].tolist()) # 定义函数:找到大于当前t的最小timestamp2 def get_min_valid_t(t): # bisect_right找到第一个大于t的元素索引 idx = bisect.bisect_right(valid_timestamps, t) # 如果索引在列表范围内,返回对应值,否则返回None return valid_timestamps[idx] if idx < len(valid_timestamps) else None # 应用到df1 df1['min_valid_timestamp2'] = df1['timestamp1'].apply(get_min_valid_t)
验证结果
以df1中timestamp1=5622548的行为例,filtered_df2的timestamp2有5629500、6578800、6583150,大于5622548的最小值是5629500,对应新列值就是这个,完全符合你的需求。
内容的提问来源于stack exchange,提问作者GiuVi
相关产品推荐
相关产品推荐

