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

