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

Python中如何实现两个DataFrame的双向查找(Two-Way lookup)

Pandas实现双向查找(Two-Way Lookup)方案

你可以用以下两种经过验证的方法实现需求,两种方法输出结果完全匹配预期:

方法1:宽表转长表后合并(推荐,性能最优)

这个方法是pandas处理这类匹配问题的标准写法,大数据量下运行效率远高于逐行查找,逻辑是先把横向存储水果数值的Table_1转换成和Table_2同结构的长表,再通过公共字段直接关联匹配。
首先构造测试数据(可直接替换为真实业务数据):

import pandas as pd

# 构造示例Table_1
table1 = pd.DataFrame({
    'Apple': [1, 3, 7],
    'Banana': [2, 5, 8],
    'Orange': [4, 2, 9],
    'Date': [2020, 2021, 2022]
})

# 构造示例Table_2
table2 = pd.DataFrame({
    'fruit': ['Apple','Apple','Apple','Banana','Banana','Banana','Orange','Orange','Orange'],
    'year': [2020,2021,2022]*3
})

核心处理代码:

# 将宽格式的Table_1转为长格式,行维度对齐Table_2的匹配字段
table1_long = table1.melt(
    id_vars='Date',
    var_name='fruit',
    value_name='number'
).rename(columns={'Date': 'year'})

# 按水果、年份两个维度左连接,直接得到带number列的结果
result = table2.merge(table1_long, on=['fruit', 'year'], how='left')

方法2:坐标索引定位(和Excel INDEX+MATCH逻辑完全一致)

如果你习惯Excel的匹配思路,可以直接把Table_1构造成「行索引为年份、列名为水果」的二维查找矩阵,直接按(年份,水果名)的坐标取对应值,写法更直观:

# 构建查找矩阵:行=年份,列=水果名,值为对应数值
lookup_matrix = table1.set_index('Date')[['Apple', 'Banana', 'Orange']]

# 逐行按坐标取值赋值
table2['number'] = [
    lookup_matrix.loc[year, fruit] 
    for year, fruit in zip(table2['year'], table2['fruit'])
]
result = table2

注意:如果存在匹配不到的(水果,年份)组合,方法1会自动给number列填充空值NaN,方法2会直接抛出索引错误,存在缺失匹配场景时优先选方法1。


两种方法运行后输出的result完全符合预期结果:

fruityearnumber
Apple20201
Apple20213
Apple20227
Banana20202
Banana20215
Banana20228
Orange20204
Orange20212
Orange20229

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 08:12:31