如何基于第二个DataFrame的起始日期过滤Pandas第一个DataFrame的对应行
实现步骤
第一步:统一日期列格式
首先需要把两个DataFrame的Date列转换为Pandas日期类型,避免字符串比较出现逻辑错误:
import pandas as pd # 构造df1 data = {'ID':['A', 'A', 'A', 'A', 'A', 'B','B','B','B', 'C','C','C','C','C','C', 'D','D','D'], 'Date':['2021-2-13', '2021-2-14', '2021-2-15', '2021-2-16', '2021-2-17', '2021-2-16', '2021-2-17', '2021-2-18', '2021-2-19', '2021-2-12', '2021-2-13', '2021-2-14', '2021-2-15', '2021-2-16','2021-2-17', '2021-2-14', '2021-2-15', '2021-2-16'], 'Steps': [1000, 1200, 1500, 2000, 1400, 4000,3400, 5000,1000, 3500,4000,5000,5300,2000,3500, 5000,5500,5200 ]} df1 = pd.DataFrame(data) # 构造df2 data1 = {'ID':['A', 'B', 'C', 'D'], 'Date':['2021-2-15', '2021-2-17', '2021-2-16', '2021-2-15']} df2 = pd.DataFrame(data1) # 转换日期格式 df1['Date'] = pd.to_datetime(df1['Date']) df2['Date'] = pd.to_datetime(df2['Date'])
第二步:过滤符合要求的行
有两种常用实现方式,按需选择即可:
方式1:映射法(代码更简洁,性能更高)
把df2中ID和起始日期的对应关系做成映射字典,直接在df1中匹配过滤:
# 构造ID-起始日期映射 id_start_map = df2.set_index('ID')['Date'].to_dict() # 过滤行 result = df1[df1['ID'].map(id_start_map) <= df1['Date']]
方式2:关联过滤法(适合后续需要保留起始日期字段的场景)
先把两个表按ID关联,再按日期条件过滤,最后删掉多余的起始日期字段:
# 重命名df2的日期列避免冲突 df2 = df2.rename(columns={'Date': 'start_date'}) # 按ID关联两个表 df_merged = df1.merge(df2, on='ID', how='left') # 过滤符合日期条件的行,删除多余字段 result = df_merged[df_merged['Date'] >= df_merged['start_date']].drop(columns='start_date')
以上两种方式输出的result就是符合要求的结果,会自动保留每个ID下日期大于等于对应起始日期的所有行。
内容的提问来源于stack exchange,提问作者Shiva
相关产品推荐
相关产品推荐

