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

如何从相关矩阵生成不含对角线、含上下三角值的4列DataFrame

实现方案
  • 第一步:修正下三角提取逻辑,排除对角线
    你之前下三角提取错误的核心是tril的k参数设置错误,k=-1才代表严格低于对角线的位置,完全排除对角线和自比较:
# 提取严格下三角(无对角线、无自比较)
df_lower = df.where(pd.np.tril(pd.np.ones(df.shape), k=-1).astype(bool)).stack().reset_index()
# 重命名列+交换Var1、Var2,匹配上三角的键顺序
df_lower.columns = ['Var2', 'Var1', 'p-val']
  • 第二步:规范上三角的列名
# 原有上三角提取逻辑不变,仅统一列名方便后续合并
df_upper = df.where(pd.np.triu(pd.np.ones(df.shape), k=1).astype(bool)).stack().reset_index()
df_upper.columns = ['Var1', 'Var2', 'p-val*']
  • 第三步:按共同键合并两个数据集
    直接以Var1、Var2为关联键做内连接,即可得到符合要求的4列结果,行数必然为1975078行,无重复无遗漏:
result = df_upper.merge(df_lower, on=['Var1', 'Var2'], how='inner')

优化建议:新版本pandas已经废弃pd.np调用方式,建议提前导入numpy后直接调用np方法,代码兼容性更好:

import numpy as np
# 上三角提取替换为
df_upper = df.where(np.triu(np.ones(df.shape), k=1).astype(bool)).stack().reset_index()
# 下三角提取替换为
df_lower = df.where(np.tril(np.ones(df.shape), k=-1).astype(bool)).stack().reset_index()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 10:36:01