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

Python品牌相似度计算代码优化:分类不匹配时如何跳过后续列

问题分析与解决方案

你的核心问题是:continue语句只跳过了当前分类列的循环迭代,后续的Price、Sales等数值列仍会执行权重累加,导致分类不匹配的行依然能拿到数值项的分数。要实现"任意分类列不匹配就跳过整行计算",需要先对所有分类列做统一校验,不通过则直接终止当前行的权重计算流程。

修改后的代码

import pandas as pd

def subproducts_weighted(brand, df):
    brand_df = df.loc[df['BRAND'] == brand]

    weights = {
        'L1': 5.0,
        'L2': 5.0,
        'L3': 4.0,
        'L4': 3.0,
        'L5': 2.0,
        'Price': 3.0,
        'Sales': 5.0,
        'Product_count': 3.0
    }

    allowed_percentage_difference = 0.1 
    max_possible_sum = sum(weights.values())
    result_dfs = []

    # 拆分分类列和数值列,方便单独校验
    category_cols = [col for col in weights.keys() if col not in ['Price', 'Sales', 'Product_count']]
    numeric_cols = ['Price', 'Sales', 'Product_count']

    for _, brand_row in brand_df.iterrows():
        for _, row in df.iterrows():
            weighted_sum = 0
            # 先校验所有分类列是否匹配
            category_match = True
            for col in category_cols:
                val1 = brand_row[col]
                val2 = row[col]
                # 匹配规则:值相等,或者两者都是"NA"
                if not (val1 == val2 or (val1 == "NA" and val2 == "NA")):
                    category_match = False
                    break  # 只要有一个分类不匹配,直接终止分类校验
            
            if not category_match:
                # 分类不匹配,跳过当前行的所有后续计算
                row_data = {'BRAND': row['BRAND'], 'weighted_sum': 0.0}
                result_dfs.append(pd.DataFrame([row_data]))
                continue
            
            # 分类全部匹配,再计算分类列的权重
            for col in category_cols:
                val1 = brand_row[col]
                val2 = row[col]
                if val1 == val2 and val1 != "NA":
                    weighted_sum += weights[col]
            
            # 计算数值列的权重
            for col in numeric_cols:
                product_value = float(brand_row[col])
                allowed_range = (
                    product_value * (1 - allowed_percentage_difference),
                    product_value * (1 + allowed_percentage_difference)
                )
                # 检查数值是否在允许范围内
                if allowed_range[0] <= row[col] <= allowed_range[1]:
                    weighted_sum += weights[col]
            
            # 计算最终相似度百分比
            similarity = (weighted_sum / max_possible_sum) * 100
            row_data = {'BRAND': row['BRAND'], 'weighted_sum': similarity}
            result_dfs.append(pd.DataFrame([row_data]))

    result_df = pd.concat(result_dfs, ignore_index=True)
    result_df = result_df.sort_values('weighted_sum', ascending=False)
    return result_df

关键修改点

  • 将分类列和数值列拆分,先单独做全量校验,只要有一个分类不匹配就直接跳过当前行的权重计算
  • 明确分类列的匹配规则:值相等,或者两者都是"NA"(和你原代码逻辑一致)
  • 分类校验通过后,再分别计算分类列和数值列的权重,逻辑更清晰
  • 避免了原代码中continue只跳过单列的问题,确保不满足分类条件的行不会获得任何额外分数

内容的提问来源于stack exchange,提问作者krizik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 06:03:35