基于Cow、Lact匹配及日期范围条件追加DataFrame行
解决方案
针对大型Pandas DataFrame的需求,推荐用合并+条件筛选的高效实现方式,避免逐行循环拖慢效率,具体操作如下:
为原df添加日期上限列(Date + 5天),用于后续范围判断
df['Date_end'] = df['Date'] + pd.Timedelta(days=5)将df与df2按
Cow、Lact字段左连接,筛选出符合日期范围的df2行# 关联两个数据集,保留df的所有行及匹配的df2行 merged = pd.merge(df, df2, on=['Cow', 'Lact'], how='left', suffixes=('', '_df2')) # 筛选df2日期在df对应行的Date至Date+5天范围内的记录 valid_df2_rows = merged.dropna(subset=['Event_df2']).query('Date_df2 >= Date & Date_df2 <= Date_end') # 提取符合条件的df2行,恢复原列名 valid_df2 = valid_df2_rows[['Cow', 'Lact', 'Event_df2', 'Date_df2']].rename(columns={'Event_df2':'Event', 'Date_df2':'Date'})合并原df与筛选后的df2行,整理成期望格式
# 合并数据,移除临时的Date_end列 result = pd.concat([df.drop(columns=['Date_end']), valid_df2], ignore_index=True) # 按Cow、Lact、Date排序,匹配期望输出的顺序 result = result.sort_values(by=['Cow', 'Lact', 'Date']).reset_index(drop=True)
超大型数据集优化方案
如果处理的是百万级以上的超大型数据,推荐使用merge_asof进一步提升效率,需先对两个数据集按分组键和日期排序:
# 对df和df2按Cow、Lact、Date排序 df_sorted = df.sort_values(by=['Cow', 'Lact', 'Date']) df2_sorted = df2.sort_values(by=['Cow', 'Lact', 'Date']) # 按分组匹配5天内的日期记录 matched = pd.merge_asof( df2_sorted, df_sorted.assign(Date_end=df_sorted['Date'] + pd.Timedelta(days=5)), on='Date', by=['Cow', 'Lact'], direction='forward', tolerance=pd.Timedelta(days=5) ) # 提取符合条件的df2行 valid_df2 = matched.dropna(subset=['Event_y'])[['Cow', 'Lact', 'Event_x', 'Date']].rename(columns={'Event_x':'Event'}) # 合并并整理结果 result = pd.concat([df, valid_df2], ignore_index=True).sort_values(by=['Cow', 'Lact', 'Date']).reset_index(drop=True)
运行上述代码后,result即为符合要求的最终数据集。
内容的提问来源于stack exchange,提问作者JohnH
相关产品推荐
相关产品推荐

