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
相关产品推荐
相关产品推荐

