Pandas非精确匹配实现类Vlookup功能:多列查找返回对应Value值
pandas模糊匹配实现方案
实现思路
不用merge、isin这类仅支持精确匹配的方法,核心逻辑是把df1所有待匹配列的内容合并为单个文本字段,再对df2的每个检索词做子串模糊匹配,无需提前处理df1中的特殊字符、空格:
- 合并df1指定检索列的所有内容为单列
- 遍历df2的每个检索词,检查是否是上述合并后文本的子串,匹配到就返回对应Value,无匹配返回空值
完整可运行代码
import pandas as pd # 示例数据构造,实际使用时替换为pd.read_csv读取你的csv文件即可 df1 = pd.DataFrame({ 'Column1': ['000_abc111', 'Def _ 1', '23uvw-00-11'], 'Column2': ['Def _ 1', '11111ghi', 'Def _ 1'], 'Column3': ['xyz876', 'Def _ 1', 'Def _ 1'], 'Value': ['Box1', 'Box2', 'Box3'] }) df2 = pd.DataFrame({ 'To_Check': ['abc', 'xyza', 'ghi', 'xyz', 'uvw'] }) # 1. 指定要检索的列,实际20列直接把对应列名放入列表即可 check_cols = ['Column1', 'Column2', 'Column3'] # 2. 合并df1所有检索列的内容为单个字符串列 df1['all_text'] = df1[check_cols].apply(lambda x: ' '.join(x.astype(str)), axis=1) # 3. 定义匹配逻辑 def get_match_value(keyword): # regex=False避免检索词中的特殊字符被识别为正则规则,na=False跳过空值 match_rows = df1[df1['all_text'].str.contains(keyword, regex=False, na=False)] # 匹配到多个结果默认取第一个,要返回所有匹配结果可以改成 return ','.join(match_rows['Value'].tolist()) return match_rows['Value'].iloc[0] if not match_rows.empty else '' # 4. 给df2生成结果列 df2['Value'] = df2['To_Check'].apply(get_match_value) # 输出结果 print(df2)
运行输出和你预期的结果完全一致:
To_Check Value 0 abc Box1 1 xyza 2 ghi Box2 3 xyz Box1 4 uvw Box3
小提示:如果需要忽略大小写匹配,在
str.contains参数中增加case=False即可。
内容的提问来源于stack exchange,提问作者soosa
相关产品推荐
相关产品推荐

