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

Python中如何将列表作为函数参数,批量计算DataFrame列相似度?

批量计算不同阈值下的DataFrame列间Jaccard相似度

现有代码

首先是测试用DataFrame的初始化代码:

import pandas as pd
import numpy as np

df1 = pd.DataFrame(np.random.randint(0,100,size=(100, 14)), columns=range(1,15))
df2 = pd.DataFrame(np.random.rand(100, 14), columns=range(1,15))

Jaccard相似度核心计算函数:

def jaccard_similarity(list1, list2):
    s1 = set(list1)
    s2 = set(list2)
    return float(len(s1.intersection(s2)) / len(s1.union(s2)))

用于计算两DataFrame列间Jaccard相似度的函数:

def jac_sim_df(df1, df2, thresh):
    L = []
    for col in df1.columns:  
        js_list = [] 
        genes1 = df1.loc[df1[col] >= 2,:].index  # 获取df1每列中值≥2的行索引(模拟差异基因集合)
        for column in df2.columns:
            genes2 = df2.loc[df2[column] >= thresh,:].index  # 获取df2每列中值≥阈值的行索引
            js = jaccard_similarity(genes1, genes2)     # 计算两组索引的Jaccard相似度
            js_list.append(js) 
        L.append(js_list)
    df = pd.DataFrame(L)
    return df

批量计算实现

要针对阈值列表批量生成结果DataFrame,可以用字典存储每个阈值对应的相似度矩阵,方便后续对比分析:

# 定义阈值列表
thresholds = [x / 1000 for x in range(1, 10)]

# 存储所有阈值对应的结果
results = {}

for thresh in thresholds:
    sim_df = jac_sim_df(df1, df2, thresh)
    # 给结果矩阵设置行列名,对应原DataFrame的列名,便于查看
    sim_df.columns = df2.columns
    sim_df.index = df1.columns
    results[thresh] = sim_df

# 示例:查看阈值为0.001时的相似度矩阵
print("阈值0.001对应的相似度矩阵:")
print(results[0.001])

补充说明

  • 用字典存储结果后,可遍历提取每个矩阵的均值、最大值等统计量,生成折线图或热力图,直观展示阈值对相似度的影响趋势
  • 若需要保存结果,可遍历results字典,将每个DataFrame导出为CSV文件

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 04:00:58