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完全符合预期结果:
| fruit | year | number |
|---|---|---|
| Apple | 2020 | 1 |
| Apple | 2021 | 3 |
| Apple | 2022 | 7 |
| Banana | 2020 | 2 |
| Banana | 2021 | 5 |
| Banana | 2022 | 8 |
| Orange | 2020 | 4 |
| Orange | 2021 | 2 |
| Orange | 2022 | 9 |
内容的提问来源于stack exchange,提问作者Sergei
相关产品推荐
相关产品推荐

