如何将Table1多列与Table2的ColA匹配,提取ColB值生成新列
实现方案
以下提供三种常用工具的实现方式,可根据自己的使用场景选择:
1. Excel/WPS 表格实现
适用无代码基础的用户,直接用公式实现:
- 前提假设:Table1表头在第1行,数据从第2行开始,Col1Col6对应AF列;Table2放在Sheet2的A、B列,数据范围为A2:B5。
- 在Table1的G列(OUTPUT列)第一个数据单元格G2输入以下公式,下拉填充即可:
=XLOOKUP(LOOKUP(1,0/(A2:F2<>"")/(A2:F2<>"-"),A2:F2),Sheet2!A$2:A$5,Sheet2!B$2:B$5,"无匹配")
- 旧版Excel无XLOOKUP可替换为INDEX+MATCH组合:
=INDEX(Sheet2!B$2:B$5,MATCH(LOOKUP(1,0/(A2:F2<>"")/(A2:F2<>"-"),A2:F2),Sheet2!A$2:A$5,0))
2. Python Pandas 实现
适用数据量较大、需要批量处理的场景:
import pandas as pd import numpy as np # 读入数据,实际使用时替换为pd.read_excel/ pd.read_csv读自己的文件 table1 = pd.DataFrame({ 'Col1': ['-', '-', '-', 'P1'], 'Col2': ['P2', '-', '-', '-'], 'Col3': ['-', 'P3', '-', '-'], 'Col4': ['-', '-', 'P4', '-'], 'Col5': ['-', '-', '-', '-'], 'Col6': ['-', '-', '', '-'] }) table2 = pd.DataFrame({ 'ColA': ['P1', 'P2', 'P3', 'P4'], 'ColB': ['MSH3', 'MSH5', 'L6', 'V5'] }) # 构造匹配字典 match_map = table2.set_index('ColA')['ColB'].to_dict() # 提取每行有效匹配值后生成结果列 def get_match_val(row): for v in row: if v not in ('-', '', np.nan): return match_map.get(v) return None table1['OUTPUT'] = table1.apply(get_match_val, axis=1) # 导出结果到Excel table1.to_excel('匹配结果.xlsx', index=False)
3. SQL 实现
适用数据存储在关系型数据库的场景,以MySQL为例:
SELECT t1.Col1, t1.Col2, t1.Col3, t1.Col4, t1.Col5, t1.Col6, t2.ColB AS OUTPUT FROM Table1 t1 LEFT JOIN Table2 t2 ON t2.ColA = CASE WHEN t1.Col1 NOT IN ('', '-') THEN t1.Col1 WHEN t1.Col2 NOT IN ('', '-') THEN t1.Col2 WHEN t1.Col3 NOT IN ('', '-') THEN t1.Col3 WHEN t1.Col4 NOT IN ('', '-') THEN t1.Col4 WHEN t1.Col5 NOT IN ('', '-') THEN t1.Col5 WHEN t1.Col6 NOT IN ('', '-') THEN t1.Col6 END
PostgreSQL可简化写法:
SELECT t1.*, t2.ColB AS OUTPUT FROM Table1 t1 LEFT JOIN Table2 t2 ON t2.ColA = COALESCE( NULLIF(t1.Col1, '-'), NULLIF(t1.Col2, '-'), NULLIF(t1.Col3, '-'), NULLIF(t1.Col4, '-'), NULLIF(t1.Col5, '-'), NULLIF(t1.Col6, '-') )
内容的提问来源于stack exchange,提问作者NayR MiMde
相关产品推荐
相关产品推荐

