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

如何高效匹配ID并筛选Pandas中日期晚于DF2的DF1行?

高效实现Pandas按ID匹配筛选日期行的方法

现有两个Pandas DataFrame(df1、df2),需要基于ID列匹配,筛选出df1中日期晚于df2对应ID日期的行,再将这些行转为字典。目前用双重iterrows()循环实现,效率极低,求最快的实现方式。

示例数据

df1
ID  date
1   1/1/2020
2   1/1/2021
3   1/1/2020

df2
ID  date
1   1/1/2020
2   1/1/2020
3   1/1/2020

筛选后的目标结果:
ID  date
2   1/1/2021

原低效代码

for index1,row1 in df1.iterrows():
    for index2,row2 in df2.iterrows():
        if row1['ID'] == row2['ID'] and row1['date'] > row2['date']:
            newdict = row1.to_dict()

优化方案

核心思路

用Pandas内置的向量化操作替代Python层面的循环,底层基于C实现,效率提升显著,尤其是数据量较大时。

具体步骤及代码

  1. 转换日期列类型:先将两个DataFrame的date列转为datetime类型,避免字符串比较出错。
  2. 按ID合并DataFrame:通过merge方法按ID关联两张表,无需手动循环匹配。
  3. 筛选符合条件的行:直接对比合并后的两列日期,快速筛选目标行。
  4. 转换为字典:将筛选结果转为所需的字典格式。
import pandas as pd

# 1. 转换日期列(若原始数据为字符串格式)
df1['date'] = pd.to_datetime(df1['date'])
df2['date'] = pd.to_datetime(df2['date'])

# 2. 按ID合并,给两列日期重命名区分
merged_df = df1.merge(df2, on='ID', suffixes=('_df1', '_df2'))

# 3. 筛选df1日期晚于df2的行
filtered_df = merged_df[merged_df['date_df1'] > merged_df['date_df2']]

# 4. 转换为字典:单行取单个字典,多行则返回字典列表
if not filtered_df.empty:
    # 单行情况
    newdict = filtered_df[['ID', 'date_df1']].rename(columns={'date_df1': 'date'}).iloc[0].to_dict()
    # 多行情况(返回字典列表)
    # newdict_list = filtered_df[['ID', 'date_df1']].rename(columns={'date_df1': 'date'}).to_dict('records')

内容的提问来源于stack exchange,提问作者ajd018

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 09:07:13