You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 05:31:35