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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 18:37:42