如何高效匹配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实现,效率提升显著,尤其是数据量较大时。
具体步骤及代码
- 转换日期列类型:先将两个DataFrame的
date列转为datetime类型,避免字符串比较出错。 - 按ID合并DataFrame:通过
merge方法按ID关联两张表,无需手动循环匹配。 - 筛选符合条件的行:直接对比合并后的两列日期,快速筛选目标行。
- 转换为字典:将筛选结果转为所需的字典格式。
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
相关产品推荐
相关产品推荐

