You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 23:20:30