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

基于两个DataFrame的id和date匹配构建新DataFrame的求助

解决方法:用Pandas全外连接实现多DataFrame按组合键合并

嘿,我懂你要的效果——把两个DataFrame里所有id+date的组合都保留下来,匹配上的行就把所有列合并,没匹配上的就给缺失列填NA,甚至还要处理同一个id+date在其中一个或两个表里重复的情况对吧?其实不用写复杂的for循环,用Pandas的merge函数就能完美搞定!

核心思路

你需要的是全外连接(Full Outer Join),它会保留两个DataFrame里所有的id+date组合:

  • 如果某个组合在两个表里都存在,就把对应行的列全部合并;
  • 如果只在一个表里存在,另一个表的列就填充NA;
  • 当某个组合在其中一个或两个表里有重复行时,会自动生成对应的所有匹配行(比如你例子里df2有两个15 2006-11-12,会和df1里的同一组合各匹配一次,生成两行结果)。

具体代码

import pandas as pd

# 假设你的df1和df2已经创建完成
result_df = pd.merge(df1, df2, on=['id', 'date'], how='outer')

# 按id排序,让结果和你期望的顺序一致(可选)
result_df = result_df.sort_values(by='id').reset_index(drop=True)

# 查看结果
print(result_df)

为什么之前的merge没生效?

你之前用内连接(inner join)只会保留两个表里都有的id+date组合,而普通的外连接如果没指定正确的连接键(on=['id','date']),可能会按单一列连接,导致结果不符合预期。而上面的代码明确指定了用id和date作为联合连接键,并且用how='outer'触发全外连接,正好满足你的需求。

效果验证

运行这段代码后,你会得到和你期望完全一致的result_df:

  • 匹配的行(比如12 2010-10-09)会合并所有列;
  • 只在df1里有的组合(比如13 2009-09-10)会保留df1的列,df2的列填NA;
  • 只在df2里有的组合(比如17 2017-10-11)会保留df2的列,df1的列填NA;
  • 重复的组合(比如15 2006-11-12)会生成对应的两行合并结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:56:55