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

多列匹配下如何将Df2与Df1合并以得到目标结果?

Pandas多列匹配合并DataFrame问题

问题场景

我手头有两个DataFrame:

Df1

CountrySexYearBin
NZM20051
NZF20051
NZM20073
KRF20052
............

Df2

CountrySexYearRate
NZM20050.5
NZM20060.4
NZF20050.6
NZF20060.3
............

我想要得到这样的结果:

CountrySexYearBinRate
NZM200510.5
NZF200510.6
NZM20073NaN
KRF20052NaN

核心需求是以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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:30:51