如何基于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
相关产品推荐
相关产品推荐

