Python多列模糊合并报错:DataFrame无tolist属性求解
多列模糊匹配合并解决方案
错误原因
你代码里的df_2[Key2]是取多列,返回的是DataFrame对象,而tolist()是Series(单列)的方法,DataFrame没有这个属性,所以报错。要实现多列模糊匹配,得先把每一行的多列内容合并成单个可匹配的单元(比如字符串或元组),再进行模糊匹配。
修正后的实现代码
首先确保已安装并导入fuzzywuzzy库:
from fuzzywuzzy import process import pandas as pd
然后定义多列模糊合并函数:
Key1 = ['Prod ID complete', 'Client name complete', 'Amount'] Key2 = ['Product ID Incomplete', 'Client name', 'Amount'] def combine_columns(row, cols, sep='|'): # 将一行的多列内容拼接成单个字符串,用分隔符避免内容混淆 return sep.join(str(row[col]) for col in cols) def fuzzy_merge(df_1, df_2, key1, key2, threshold=90, limit=1): # 为两个数据集生成合并后的匹配标识列 df_1['combined_key1'] = df_1.apply(combine_columns, cols=key1, axis=1) df_2['combined_key2'] = df_2.apply(combine_columns, cols=key2, axis=1) # 提取df_2的匹配标识列表 match_list = df_2['combined_key2'].tolist() # 对df_1的每一行标识,在df_2的列表中找模糊匹配项 df_1['matches'] = df_1['combined_key1'].apply( lambda x: process.extract(x, match_list, limit=limit) ) # 筛选符合阈值的匹配项,并关联df_2的对应行数据 merged_rows = [] for idx, row in df_1.iterrows(): # 获取符合阈值的匹配结果 valid_matches = [match[0] for match in row['matches'] if match[1] >= threshold] if valid_matches: # 找到df_2中对应的行,合并到当前行 matched_df = df_2[df_2['combined_key2'].isin(valid_matches)] for _, match_row in matched_df.iterrows(): merged_row = row.to_dict() merged_row.update(match_row.to_dict()) merged_rows.append(merged_row) else: # 无匹配项时保留原行,df_2列填充NaN merged_row = row.to_dict() for col in df_2.columns: merged_row[col] = None merged_rows.append(merged_row) # 转换为DataFrame并清理临时列 result_df = pd.DataFrame(merged_rows) result_df.drop(['combined_key1', 'combined_key2', 'matches'], axis=1, inplace=True) return result_df # 调用函数(假设Data1、Data2是你的数据集) final_df = fuzzy_merge(Data1, Data2, Key1, Key2, threshold=85)
关键说明
combine_columns函数:把一行的多列内容用分隔符拼接成字符串,确保每一行的多列信息作为一个整体参与模糊匹配。- 匹配后关联原数据:不再只存储匹配字符串,而是直接把df_2中匹配到的行数据合并到df_1的对应行,实现真正的合并效果。
- 阈值控制:只有匹配度(0-100)超过设定阈值的结果才会被保留,可根据需求调整
threshold参数。
内容的提问来源于stack exchange,提问作者ross jim
相关产品推荐
相关产品推荐

