多列匹配下如何将Df2与Df1合并以得到目标结果?
Pandas多列匹配合并DataFrame问题
问题场景
我手头有两个DataFrame:
Df1
| Country | Sex | Year | Bin |
|---|---|---|---|
| NZ | M | 2005 | 1 |
| NZ | F | 2005 | 1 |
| NZ | M | 2007 | 3 |
| KR | F | 2005 | 2 |
| ... | ... | ... | ... |
Df2
| Country | Sex | Year | Rate |
|---|---|---|---|
| NZ | M | 2005 | 0.5 |
| NZ | M | 2006 | 0.4 |
| NZ | F | 2005 | 0.6 |
| NZ | F | 2006 | 0.3 |
| ... | ... | ... | ... |
我想要得到这样的结果:
| Country | Sex | Year | Bin | Rate |
|---|---|---|---|---|
| NZ | M | 2005 | 1 | 0.5 |
| NZ | F | 2005 | 1 | 0.6 |
| NZ | M | 2007 | 3 | NaN |
| KR | F | 2005 | 2 | NaN |
核心需求是以Df1的Country, Sex, Year这三列作为匹配条件,把Df2的Rate列合并进来。之前试了merge和join,但好像只会用单列匹配,没得到预期结果,该怎么解决?
解决方案
其实你完全可以用Pandas的merge方法实现多列匹配,只是之前可能没用到正确的参数写法。直接把多个匹配列名放到列表里传给on参数,再指定左连接方式就可以了,正好满足你的需求。
推荐实现代码
import pandas as pd # 假设Df1和Df2已经是你定义好的DataFrame result_df = pd.merge(Df1, Df2, on=['Country', 'Sex', 'Year'], how='left')
关键参数解释
on=['Country', 'Sex', 'Year']:告诉Pandas同时用这三列作为匹配键,只有当某一行的这三列值在两个DataFrame中完全一致时,才会把Df2的Rate值对应过来。how='left':采用左连接逻辑,保留Df1的所有行,如果Df2里没有对应匹配的行,Rate列就自动填充NaN,这正好和你期望的结果一致。
用join实现的替代方案
如果你习惯用join,也可以先把两个DataFrame的索引设置为这三列,再做左连接:
# 先设置多列索引 Df1.set_index(['Country', 'Sex', 'Year'], inplace=True) Df2.set_index(['Country', 'Sex', 'Year'], inplace=True) # 执行左连接后重置索引 result_df = Df1.join(Df2, how='left').reset_index()
不过这种方法需要修改原DataFrame的索引,相对来说merge的写法更直接,不用额外调整索引,更推荐第一种方式。
内容的提问来源于stack exchange,提问作者Devin Lee
相关产品推荐
相关产品推荐

