如何从相关矩阵生成不含对角线、含上下三角值的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
相关产品推荐
相关产品推荐

