如何在Python Pandas中根据某DataFrame的日期条件合并三个DataFrame?
Pandas实现条件合并:根据时间选择关联不同DataFrame
首先先确认个小细节:你给出的df3列名写的是TIME,但最终结果里对应的是VALUE列,应该是笔误啦,我在代码里会把df3的TIME列重命名为VALUE,不然合并后列名会不符合预期~
下面给你两种实用的实现方法,你可以根据自己的数据规模和习惯选择:
方法一:拆分数据集分别合并后拼接
这个思路最直观:先把df1按时间阈值拆成两部分,分别和df2、df3按ID合并,最后把结果拼接起来。
import pandas as pd # 第一步:确保df1的TIME列是datetime类型(如果还不是的话) df1['TIME'] = pd.to_datetime(df1['TIME']) # 定义时间分割点 cutoff_date = pd.to_datetime('2022-07-19') # 拆分df1为两个子集 df1_early = df1[df1['TIME'] < cutoff_date] # 时间小于阈值的部分 df1_late = df1[df1['TIME'] >= cutoff_date] # 时间大于等于阈值的部分 # 分别合并:早的部分连df2,晚的部分连df3(注意重命名df3的列) merged_early = pd.merge(df1_early, df2, on='ID', how='left') merged_late = pd.merge(df1_late, df3.rename(columns={'TIME': 'VALUE'}), on='ID', how='left') # 拼接两个结果,按ID排序(可选) final_df = pd.concat([merged_early, merged_late]).sort_values('ID').reset_index(drop=True) # 查看结果 print(final_df)
这里用how='left'是为了保留df1里所有的ID,如果某个ID在df2或df3里没有匹配,会显示NaN;如果只需要保留两边都有的ID,可以改成how='inner'。
方法二:先全量合并再条件赋值
如果不想拆分数据集,可以先把df1和df2、df3都合并,再根据时间条件选择对应的VALUE值:
import pandas as pd # 同样先确保TIME列是datetime类型 df1['TIME'] = pd.to_datetime(df1['TIME']) cutoff_date = pd.to_datetime('2022-07-19') # 先合并df1和df2、df3,给不同的VALUE列加后缀区分 df_merged = df1.merge(df2, on='ID', how='left') df_merged = df_merged.merge(df3.rename(columns={'TIME': 'VALUE_df3'}), on='ID', how='left') # 根据时间条件选择对应的VALUE df_merged['VALUE'] = df_merged.apply( lambda row: row['VALUE'] if row['TIME'] < cutoff_date else row['VALUE_df3'], axis=1 ) # 保留需要的列,整理结果 final_df = df_merged[['ID', 'TIME', 'VALUE']].sort_values('ID').reset_index(drop=True) print(final_df)
这种方法逻辑更紧凑,适合数据量不大的场景;如果你的df1非常大,方法一的拆分合并可能会更高效。
内容的提问来源于stack exchange,提问作者dingaro
相关产品推荐
相关产品推荐

