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

