如何用lambda函数计算Pandas DataFrame行与首行的列序敏感相似度得分
Pandas按规则计算行相似度得分(lambda实现)
问题说明
现有如下Pandas DataFrame:
| col_1 | col_2 | col_3 | col_4 | col_5 | col_6 |
|---|---|---|---|---|---|
| a | b | c | d | e | f |
| a | b | c | h | j | f |
| a | b | c | k | e | l |
| x | b | c | d | e | f |
需要为每行计算得分,判断其与第一行的相似度,规则如下:
- 核心优先级:与第一行值相同的列数越多,得分越高
- 次级优先级:若相同列数一致,从左到右比较列匹配情况,左侧列匹配的行优先级更高
示例中的最终排序应为:
- 第4行:与第一行有4列值相同
- 第3行:与第一行有3列值相同,相比第2行,优先匹配了更靠左的col_5列
- 第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
相关产品推荐
相关产品推荐

