如何检测Table 1的A列是否包含Table 2的A列值并返回对应B列数据?
需求实现方案建议
需求概述
检测Table 1的A列文本中是否包含Table 2的A列值,若匹配成功,则在Table 1新增B列并填入Table 2对应匹配行的B列值;无匹配则留空。
参考数据
Table 2(匹配映射表)
| A | B |
|---|---|
| Y01 | 102 |
| Y06 | 103 |
| Y02 | 105 |
| Y08 | 110 |
| Y0545 | 106 |
目标输出Table 1
| A | B |
|---|---|
| dhjasd sd Y02sd | 105 |
| Y02 dsd | 105 |
| sds Y0545 dsas dds | 106 |
| Y093 sad | |
| sd Y304sd |
实现方案
1. Excel/Google Sheets 公式实现
在Table 1的B2单元格输入以下公式,下拉填充即可:
=XLOOKUP(TRUE, ISNUMBER(SEARCH(Table2!$A$2:$A$6, A2)), Table2!$B$2:$B$6, "")
- 原理:
SEARCH检测Table1的A列文本是否包含Table2的A列值,返回位置;ISNUMBER将结果转换为布尔值;XLOOKUP匹配第一个符合条件的Table2的B列值,无匹配则返回空。 - 注意:若需精确完整匹配而非包含,将
SEARCH替换为EXACT即可。
2. Python Pandas 实现
适合处理大规模数据,基础代码示例:
import pandas as pd # 构造示例数据 df1 = pd.DataFrame({ 'A': ['dhjasd sd Y02sd', 'Y02 dsd', 'sds Y0545 dsas dds', 'Y093 sad', 'sd Y304sd'] }) df2 = pd.DataFrame({ 'A': ['Y01', 'Y06', 'Y02', 'Y08', 'Y0545'], 'B': [102, 103, 105, 110, 106] }) # 定义匹配逻辑函数 def get_matched_b(row): for _, match_row in df2.iterrows(): if match_row['A'] in row['A']: return match_row['B'] return None # 新增B列 df1['B'] = df1.apply(get_matched_b, axis=1) # 查看结果 print(df1)
- 大数据量优化方案:改用正则批量匹配提升效率
# 生成匹配正则表达式 df2['pattern'] = df2['A'].apply(lambda x: f'(?:{x})') combined_pattern = '|'.join(df2['pattern']) # 提取匹配的关键词并关联映射值 matches = df1['A'].str.extract(f'({combined_pattern})', expand=False) df1 = df1.merge(df2, left_on=matches, right_on='A', how='left').drop(columns=['A_y', 'pattern']).rename(columns={'A_x': 'A'})
3. SQL 实现
以MySQL为例,通过LIKE关联查询实现:
SELECT t1.A, t2.B FROM Table1 t1 LEFT JOIN Table2 t2 ON t1.A LIKE CONCAT('%', t2.A, '%') ORDER BY t1.A;
- 说明:
LEFT JOIN保证Table1的所有行都被保留,匹配成功则显示Table2的B值,无匹配则为NULL;若需仅保留第一个匹配结果,可结合GROUP BY t1.A和MAX(t2.B)(或MIN,按需选择)。
内容的提问来源于stack exchange,提问作者newt335
相关产品推荐
相关产品推荐

