多DataFrame绘制相关系数热力图报ValueError的原因及修复方法
错误原因与修复方案
错误原因
- 索引对齐逻辑冲突:你将三个表的
t列分别修改为全表统一的类别值1、2、3后,仍将t设为索引进行按列拼接,此时单表内所有行的索引完全重复。pd.concat按列拼接时默认按索引值对齐行,会将三个表的索引取并集后逐值匹配,最终拼接后的行数为三个表行数之和(你场景中为60行),和原有代码预期的18行(原t列的唯一值数量)完全不符,因此抛出形状不匹配错误。 - 业务逻辑矛盾:原
t列的作用是作为行对齐的唯一标识,将其修改为类别标签后就失去了行对齐的能力,强行按原有逻辑拼接得到的结果不具备计算相关系数的统计意义。
修复方案
根据你的实际需求选择对应方案即可:
方案1:保留原行对齐逻辑(推荐,相关系数计算结果有统计意义)
如果仍需要按原有观测维度对齐行计算相关系数,不要修改原用于对齐的t列,额外新增类别列存储1/2/3的标签即可,示例代码如下:
import pandas as pd import seaborn as sns # 新增类别列,不修改原有t列的对齐作用 X['category'] = 1 Y['category'] = 2 Z['category'] = 3 # 按原有逻辑拼接:t设为索引,按列拼接并新增来源层级区分列 concat_df = pd.concat( [X.set_index('t'), Y.set_index('t'), Z.set_index('t')], axis=1, keys=['X', 'Y', 'Z'] ) # 计算相关系数并绘制热力图 corr_matrix = concat_df.corr(numeric_only=True) sns.heatmap(corr_matrix, annot=True, cmap='RdBu_r')
方案2:不需要行对齐,仅计算列的皮尔逊相关
如果不需要按原有观测对齐,可以给各表的列加上来源前缀后按行索引位置对齐,短表缺失的行自动补NaN,计算相关系数时会自动忽略成对的空值,示例代码如下:
import pandas as pd import seaborn as sns # 给各表非t列加来源前缀,避免列名重复 X_prefixed = X.drop('t', axis=1).add_prefix('X_') Y_prefixed = Y.drop('t', axis=1).add_prefix('Y_') Z_prefixed = Z.drop('t', axis=1).add_prefix('Z_') # 按列拼接,自动按行位置对齐 concat_df = pd.concat([X_prefixed, Y_prefixed, Z_prefixed], axis=1) # 计算相关系数并绘图 corr_matrix = concat_df.corr(numeric_only=True) sns.heatmap(corr_matrix, annot=True, cmap='RdBu_r')
内容的提问来源于stack exchange,提问作者Rahul Paul
相关产品推荐
相关产品推荐

