如何在Python中对两个不同长度的DataFrame列进行部分匹配?
实现DataFrame部分匹配并新增列
数据定义
先把两个DataFrame用代码定义出来:
import pandas as pd import numpy as np # DF1 df1 = pd.DataFrame({ 'filename': ['b~cute', 'b~cute2', np.nan, 'b~cat', 'b~dog', np.nan] }) # DF2 df2 = pd.DataFrame({ 'filename': [ 'sgjsg~12345~b~cute~v4.jpeg', 'jgsgj~1233~b~dog~v4.jpeg', 'jhdjd~1252~b~cat~v4.jpeg', 'sggsn~1252~b~cute2~v4.jpeg' ] })
解决方案
方法1:遍历匹配(灵活通用)
通过apply遍历DF1的每个文件名,在DF2中找到包含该字符串的路径:
def get_filepath(name): if pd.isna(name): return np.nan # 筛选DF2中包含当前文件名的记录 match_row = df2[df2['filename'].str.contains(name, na=False)] return match_row['filename'].iloc[0] if not match_row.empty else np.nan df1['filepath'] = df1['filename'].apply(get_filepath)
方法2:构建映射字典(效率更高)
先从DF2中提取匹配关键词,构建关键词到路径的字典,再直接映射到DF1:
# 构建关键词-路径映射字典 match_map = {} for path in df2['filename']: # 拆分路径字符串,提取b~开头的关键词 for segment in path.split('~'): if segment.startswith('b~'): match_map[segment] = path break # 映射到DF1 df1['filepath'] = df1['filename'].map(match_map)
最终结果
执行任意一种方法后,DF1会得到如下结果:
| filename | filepath |
|---|---|
| b~cute | sgjsg12345bcutev4.jpeg |
| b~cute2 | sggsn1252bcute2v4.jpeg |
| nan | nan |
| b~cat | jhdjd1252bcatv4.jpeg |
| b~dog | jgsgj1233bdogv4.jpeg |
| nan | nan |
内容的提问来源于stack exchange,提问作者HiAlllllll
相关产品推荐
相关产品推荐

