如何基于部分匹配文本合并两个Pandas DataFrame?
Pandas基于部分文本匹配合并DataFrame的解决方案
你需要基于df2['Site']与df1['Hostname']中的部分文本匹配来合并两个DataFrame,原代码的核心问题是没有找到正确的关联列,且reduce和merge的用法存在错误。以下是具体实现步骤:
1. 构造示例数据(可替换为你的真实数据)
import pandas as pd df1 = pd.DataFrame({ 'Hostname': ['ServerABC101', 'ServerABC102', 'ServerDDC103', 'ServerDDC609', 'ServerDDC103', 'ServerDDC609'], 'Region': ['US', 'US', 'PAC', 'Emea', 'PAC', 'Emea'], 'Model': ['Cisco', 'Cisco', 'Intel', 'Intel', 'Intel', 'Intel'] }) df2 = pd.DataFrame({ 'Site': ['ABC', 'DDC'], 'City': ['NYC', 'DAL'], 'State': ['NY', 'TX'] })
2. 从df1的Hostname中提取Site匹配部分
根据你的数据格式(Server+Site+数字),用正则表达式提取Hostname中的Site字段:
# 匹配"Server"后、数字前的字母部分,生成新的Site列 df1['Site'] = df1['Hostname'].str.extract(r'Server(\w+)\d+')
如果Hostname的格式不固定(Site位置不确定),可以用遍历匹配的方法(适合小型数据集,大型数据集优先用正则):
def match_site(hostname): for site in df2['Site']: if site in hostname: return site return None df1['Site'] = df1['Hostname'].apply(match_site)
3. 基于Site列合并两个DataFrame
用pd.merge合并,选择how='left'保留df1的所有行:
final_df = pd.merge(df1, df2, on='Site', how='left')
合并结果示例
Hostname Region Model Site City State 0 ServerABC101 US Cisco ABC NYC NY 1 ServerABC102 US Cisco ABC NYC NY 2 ServerDDC103 PAC Intel DDC DAL TX 3 ServerDDC609 Emea Intel DDC DAL TX 4 ServerDDC103 PAC Intel DDC DAL TX 5 ServerDDC609 Emea Intel DDC DAL TX
原代码错误说明
reduce的参数逻辑错误:lambda变量与内部引用的变量不匹配,且merge的how参数未加引号,括号闭合错误;- 核心逻辑错误:两个DataFrame没有共同的
Hostname列,无法直接以此作为关联键,必须先提取出匹配的Site字段再合并。
内容的提问来源于stack exchange,提问作者user1471980
相关产品推荐
相关产品推荐

