如何使用Scipy输出符合r、p阈值的显著相关候选行对
实现方案
因为你处理的是15000行的大矩阵,直接展开全量配对会出现重复(如row1-row2和row2-row1)和自身配对的无效数据,所以优先取上三角(不含对角线)的元素做筛选,既减少计算量也避免冗余结果。
完整实现代码
import pandas as pd import numpy as np from scipy import stats # 原有读取和计算逻辑 df = pd.read_csv('my_dataframe.csv', index_col=0) r, p = stats.spearmanr(df.T) # -------------------------- # 筛选和输出逻辑 # -------------------------- # 1. 自定义阈值,可按需修改 R_THRESHOLD = 0 P_THRESHOLD = 0.7 # 2. 获取行名列表 row_labels = df.index.tolist() n_rows = len(row_labels) # 3. 取上三角索引(k=1表示排除对角线,避免自身配对,同时消除重复配对) upper_tri_idx = np.triu_indices(n_rows, k=1) # 4. 提取所有上三角位置的行名对、r值、p值 row1_all = [row_labels[i] for i in upper_tri_idx[0]] row2_all = [row_labels[j] for j in upper_tri_idx[1]] r_all = r[upper_tri_idx] p_all = p[upper_tri_idx] # 5. 按阈值筛选 mask = (r_all > R_THRESHOLD) & (p_all < P_THRESHOLD) # 6. 构造结果并输出 result = pd.DataFrame({ 'row1': np.array(row1_all)[mask], 'row2': np.array(row2_all)[mask], 'r-value': r_all[mask], 'p-value': p_all[mask] }) # 输出为目标格式csv,不需要表头可加header=False参数 result.to_csv('filtered_correlation.csv', index=False)
可选调整项
- 如果需要筛选正负相关的绝对值阈值,把条件改为
np.abs(r_all) > R_THRESHOLD即可 - 内存不足时可以把上三角索引分块遍历筛选,避免一次性加载全量配对数据
- 需要保留双向配对(row1-row2和row2-row1同时存在)的话,删除上三角索引的逻辑,直接遍历全矩阵即可
内容的提问来源于stack exchange,提问作者Apex
相关产品推荐
相关产品推荐

