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

如何基于df_2的日期过滤df_1,删除对应letter的晚于日期的行?

问题描述

现有两个DataFrame:

import pandas as pd

df_1 = pd.DataFrame({
    'scope': ['000', '100', '101', '102', '103', '104', '105', '106'],
    'letter': ['ABC', 'ABC', 'DEF', 'CCC', 'ABC', 'ABC', 'CCC', 'DEF'],
    'date': ['2022-07-01', '2022-08-01', '2022-08-02', '2022-08-15', '2022-08-16', '2022-08-31', '2022-09-01', '2022-09-02']
})

df_2 = pd.DataFrame({
    'letter': ['ABC', 'DEF', 'CCC'],
    'date': ['2022-08-01', '2022-08-02', '2022-09-02']
})

需求:删除df_1中date晚于df_2对应letter的date的行,期望结果如下:

df_1_new = pd.DataFrame({
    'scope': ['000', '100', '101', '102', '105'],
    'letter': ['ABC', 'ABC', 'DEF', 'CCC', 'CCC'],
    'date': ['2022-07-01', '2022-08-01', '2022-08-02', '2022-08-15', '2022-09-01']
})

尝试过join操作,但会误删早于目标日期的行,不符合需求。请问能否通过join加条件实现,或者有无无需join的方法?


解决方案

方法一:Merge(Join)加条件过滤

先合并两个DataFrame获取对应letter的截止日期,再过滤掉不符合条件的行:

# 转换日期列为datetime类型,确保比较逻辑正确
df_1['date'] = pd.to_datetime(df_1['date'])
df_2['date'] = pd.to_datetime(df_2['date'])

# 按letter合并,保留df_1所有行,添加截止日期列
merged = df_1.merge(df_2, on='letter', suffixes=('', '_cutoff'))

# 过滤日期不晚于截止日期的行,保留原df_1的列
df_1_new = merged[merged['date'] <= merged['date_cutoff']][['scope', 'letter', 'date']].reset_index(drop=True)

方法二:无需Join,映射匹配截止日期

将df_2转为字典,通过映射给df_1添加截止日期后过滤:

# 转换日期类型
df_1['date'] = pd.to_datetime(df_1['date'])
df_2['date'] = pd.to_datetime(df_2['date'])

# 生成letter到截止日期的映射字典
cutoff_map = df_2.set_index('letter')['date'].to_dict()

# 添加截止日期列并过滤
df_1['cutoff_date'] = df_1['letter'].map(cutoff_map)
df_1_new = df_1[df_1['date'] <= df_1['cutoff_date']][['scope', 'letter', 'date']].reset_index(drop=True)

关键说明

  • 必须将date列转为datetime类型,避免字符串比较的潜在逻辑错误(虽然本例中字符串顺序与日期一致,但规范处理更稳妥)。
  • 方法二效率更高,尤其当df_1数据量较大时,省去了合并操作的额外开销。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 12:48:19