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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 09:57:00