如何利用pandas Series中的机构信息匹配两个DataFrame?
问题:基于机构信息匹配两个DataFrame的最优结果
数据结构说明
df1(待匹配的目标数据)
| first_name | last_name | affiliation |
|---|---|---|
| jean | dulac | University of Texas |
| peter | huta | University of Maryland |
df2(包含潜在匹配项的数据源)
| first_name | last_name | affiliations_all |
|---|---|---|
| jean | dulac | [{'city_name': 'Kyoto', 'country_name': 'Japan', 'name': 'Kyoto University'}] |
| jean | dulac | [{'city_name': 'Texas', 'country_name': 'USA', 'name': 'University of Texas'}] |
其中affiliations_all列是包含机构字典的列表,类型为pandas.core.series.Series,无法修改原始结构。
需求
通过机构信息区分df2中的潜在匹配项,为df1中的每条记录保留最可能的匹配结果。你的思路是:先清理df1的affiliation列(已实现),再对df2的affiliations_all列执行相同清理,最后判断匹配关系。
实现步骤及代码
1. 定义统一的机构名称清理函数
先写一个通用函数,移除无关词汇(如"university"、"of"),统一文本格式,确保df1和df2的清理规则一致:
import pandas as pd def clean_affiliation(text): # 转小写、拆分词汇、移除停用词、重新拼接 stop_words = {'university', 'of', 'the'} words = text.lower().split() cleaned_words = [word for word in words if word not in stop_words] return ' '.join(cleaned_words).strip()
2. 处理df1的机构列(你已实现,此处做确认)
df1['cleaned_affiliation'] = df1['affiliation'].apply(clean_affiliation)
3. 处理df2的affiliations_all列
遍历每个列表中的机构字典,提取name字段并应用清理函数,生成清理后的机构列表:
def process_affiliations(aff_list): # 遍历列表中的每个机构字典,提取名称并清理 cleaned_affs = [clean_affiliation(aff['name']) for aff in aff_list] return cleaned_affs df2['cleaned_affiliations'] = df2['affiliations_all'].apply(process_affiliations)
4. 合并数据并判断匹配
先按姓名合并两个DataFrame,再检查df1的清理后机构是否存在于df2的清理后机构列表中:
# 按姓名合并,得到所有潜在匹配对 merged_df = pd.merge(df1, df2, on=['first_name', 'last_name'], how='left') # 判断是否匹配 merged_df['is_match'] = merged_df.apply( lambda x: x['cleaned_affiliation'] in x['cleaned_affiliations'], axis=1 )
5. 筛选最优匹配结果
# 筛选匹配成功的记录 matched_results = merged_df[merged_df['is_match']] # 若需每个姓名仅保留一条匹配结果(取第一条) final_results = matched_results.groupby(['first_name', 'last_name']).first().reset_index()
这样就能精准匹配到符合机构信息的结果,避免原始字符串匹配的误差。
内容的提问来源于stack exchange,提问作者Clara HL
相关产品推荐
相关产品推荐

