Pandas中基于字符串包含匹配双DataFrame生成新列
Pandas 按字符串包含关系匹配新增列实现方案
核心逻辑:遍历df1的A列每个值,在df2的B列中查找包含该值的行,提取对应C列值赋值到df1的新列。
完整实现代码
首先导入依赖并构造示例测试数据:
import pandas as pd # 构造示例df1 df1 = pd.DataFrame({ 'A': ['code', 'other', 'medium'], 'X': ['...', '...', '...'], 'Y': ['...', '...', '...'], 'Z': ['...', '...', '...'] }) # 构造示例df2 df2 = pd.DataFrame({ 'B': ['small/medium', 'large', 'other part', 'code 01'], 'C': ['ID 20', 'ID 2', 'ID 8', 'ID 9'], 'P': ['...', '...', '...', '...'], 'Q': ['...', '...', '...', '...'] })
核心匹配逻辑:
def get_matched_c(a_val): # 筛选df2中B列包含当前A列值的行,na=False避免空值报错 matched = df2[df2['B'].str.contains(a_val, na=False)] # 有匹配返回第一个对应C值,无匹配返回空值 return matched['C'].iloc[0] if not matched.empty else pd.NA df1['new_col'] = df1['A'].apply(get_matched_c)
执行后得到的df1和预期输出完全一致:
| 序号 | A | new_col | X | Y | Z |
|---|---|---|---|---|---|
| 0 | code | ID 9 | ... | ... | ... |
| 1 | other | ID 8 | ... | ... | ... |
| 2 | medium | ID 20 | ... | ... | ... |
可选优化说明
- 若不需要区分大小写匹配,可在
str.contains中添加参数case=False - 若数据量较大(十万级以上),可以提前将df2的B、C列转为映射字典,避免逐行遍历df2提升效率
- 若存在多个匹配结果的场景,可按需调整返回规则,比如拼接所有匹配的C值、取最新匹配值等
内容的提问来源于stack exchange,提问作者nilsinelabore
相关产品推荐
相关产品推荐

