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

如何用lambda函数计算Pandas DataFrame行与首行的列序敏感相似度得分

Pandas按规则计算行相似度得分(lambda实现)

问题说明

现有如下Pandas DataFrame:

col_1col_2col_3col_4col_5col_6
abcdef
abchjf
abckel
xbcdef

需要为每行计算得分,判断其与第一行的相似度,规则如下:

  • 核心优先级:与第一行值相同的列数越多,得分越高
  • 次级优先级:若相同列数一致,从左到右比较列匹配情况,左侧列匹配的行优先级更高

示例中的最终排序应为:

  1. 第4行:与第一行有4列值相同
  2. 第3行:与第一行有3列值相同,相比第2行,优先匹配了更靠左的col_5列
  3. 第2行:与第一行有3列值相同,但未匹配col_5列

要求用lambda函数实现,将第一行作为基准为每行分配得分并完成排序。

实现代码

1. 初始化DataFrame并获取基准行

import pandas as pd

# 构建示例DataFrame
df = pd.DataFrame({
    'col_1': ['a', 'a', 'a', 'x'],
    'col_2': ['b', 'b', 'b', 'b'],
    'col_3': ['c', 'c', 'c', 'c'],
    'col_4': ['d', 'h', 'k', 'd'],
    'col_5': ['e', 'j', 'e', 'e'],
    'col_6': ['f', 'f', 'l', 'f']
})

# 提取第一行作为匹配基准
base_row = df.iloc[0]

2. 用lambda计算复合得分

我们设计一个元组类型的复合得分:

  • 元组第一个元素:匹配列的数量(核心优先级)
  • 元组第二个元素:按列优先级计算的加权分(次级优先级,左列权重更高)

代码实现:

# 获取总列数,用于计算列权重
total_cols = len(df.columns)

# 为每行计算得分
df['similarity_score'] = df.apply(lambda row: (
    # 第一部分:统计与基准行匹配的列数
    sum(row == base_row),
    # 第二部分:左列权重更高的加权分,确保左列匹配优先
    sum(2 ** (total_cols - 1 - idx) for idx, col in enumerate(df.columns) if row[col] == base_row[col])
), axis=1)

# 按得分降序排序(先按匹配列数,再按加权分)
sorted_df = df.sort_values('similarity_score', ascending=False)

结果验证

运行后sorted_df的行顺序完全符合需求:

  • 第4行得分:(4, 29)(匹配col_2、col_3、col_4、col_6)
  • 第3行得分:(3, 58)(匹配col_1、col_2、col_3、col_5)
  • 第2行得分:(3, 57)(匹配col_1、col_2、col_3、col_6)
  • 第1行得分:(6, 63)(完全匹配自身)

原理说明

  • 匹配列数作为核心得分,直接决定行的优先级层级
  • 加权分采用2^(总列数-1-列索引)的计算方式:列越靠左,索引越小,计算出的权重值越大,确保当匹配列数相同时,左列匹配更多的行加权分更高,排序更靠前

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 00:01:41