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

如何在选课DataFrame上应用Levenshtein distance计算行间相似度

计算学生课程行之间的Levenshtein相似度

首先还原你的数据集:

import pandas as pd

data = {
    'Student_ID': ['131X1319', '13212YX3', '13216131', '132921W6', '132W22YY', '132X219Y', '132Y231B'],
    0: ['COMM1370', 'COMM2362', 'COMM1318', 'CRIJ3380', 'COMM2362', 'COMM2362', 'COMM2371'],
    1: ['COMM1307', 'COMM4381', 'COMM2362', 'CRIJ3311', 'COMM1318', 'COMM1318', 'COMM2371'],
    2: ['COMM1315', 'MATH1314', 'COMM4381', pd.NA, 'COMM4381', 'HIST1301', 'COMM1307'],
    3: [pd.NA, 'COMM1318', 'PSYC3320', pd.NA, 'COMM3315', 'COMM4381', 'COMM3340'],
    4: [pd.NA, 'COMM4396', 'COMM4396', pd.NA, 'COMM4340', 'POLS2301', 'COMM4310'],
    5: [pd.NA, 'POLS2301', 'COMM4396', pd.NA, 'COMM3390', 'CRIJ1301', 'COMM1373'],
    6: [pd.NA, 'COMM4362', 'SOCI3375', pd.NA, 'COMM1370', 'COMM4397', 'COMM1373']
}

df = pd.DataFrame(data)

步骤1:处理每行课程数据

Levenshtein距离基于字符串计算,先把每行的非空课程拼接成空格分隔的字符串:

# 生成每行的课程字符串(忽略NaN)
df['course_str'] = df.drop('Student_ID', axis=1).apply(lambda x: ' '.join(x.dropna()), axis=1)

步骤2:安装并导入Levenshtein库

先安装依赖:

pip install python-Levenshtein

导入库:

import Levenshtein

步骤3:计算距离矩阵和相似度矩阵

  • Levenshtein距离:数值越小,两行课程序列越相似
  • 相似度:用1 - (距离 / 两个字符串的最大长度)转换为0-1范围的数值,越接近1相似度越高
# 获取学生ID和对应的课程字符串列表
student_ids = df['Student_ID'].tolist()
course_strings = df['course_str'].tolist()

# 初始化距离矩阵
distance_df = pd.DataFrame(index=student_ids, columns=student_ids)
# 初始化相似度矩阵
similarity_df = pd.DataFrame(index=student_ids, columns=student_ids)

# 填充矩阵
for i in range(len(student_ids)):
    str_i = course_strings[i]
    len_i = len(str_i)
    for j in range(len(student_ids)):
        str_j = course_strings[j]
        len_j = len(str_j)
        # 计算Levenshtein距离
        dist = Levenshtein.distance(str_i, str_j)
        distance_df.iloc[i, j] = dist
        # 计算相似度
        max_len = max(len_i, len_j)
        sim = 1 - (dist / max_len) if max_len != 0 else 1.0
        similarity_df.iloc[i, j] = round(sim, 4)

查看结果

# 打印距离矩阵
print("Levenshtein距离矩阵:")
print(distance_df)

# 打印相似度矩阵
print("\n相似度矩阵:")
print(similarity_df)

可选优化

  • 若不关心课程顺序,可以先对每行课程排序后再拼接字符串
  • 若要排除重复课程,可修改拼接逻辑为' '.join(x.dropna().unique())

内容的提问来源于stack exchange,提问作者black street boy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 05:20:32