为何DataFrame相关性呈现该结果?如何筛选匹配目标列的最优列?
筛选DataFrame中与目标列匹配度最高的列及相关性结果疑问解答
嘿,我来帮你搞定这个问题!你现在手里有个以列作为测试项的DataFrame,想从中挑出和目标列匹配度最高的列,同时还对当前算出的相关性结果有点摸不着头脑,对吧?
你的代码与数据片段
先把你给出的代码和数据整理成清晰的可参考片段:
import pandas as pd # 测试过pandas 0.22和pandas 0.20版本 data = { 0.1: {10000.0: 1.1417023723316702, 20000.0: 1.675669860738065, 30000.0: 2.1391047345794565, 40000.0: 2.588884897140648}, 0.3: {10000.0: 3.4251071169950102, 20000.0: 5.027009582214195, 30000.0: 6.4173142037383695, 40000.0: 7.766654691421943}, 0.5: {10000.0: 5.708511861658351, 20000.0: 8.378349303690324, ...} } df = pd.DataFrame(data)
关于相关性结果的疑问解析
你觉得相关性结果不符合预期?大概率是这几个原因在搞怪:
- 皮尔逊相关的局限性:pandas默认计算的是皮尔逊相关系数,它只衡量线性相关程度。如果你的测试列和目标列是非线性关系(比如二次、指数关系),这个系数就没法准确反映真实的匹配度,甚至会给出看似反常的结果。
- 数据缩放的影响:从你给出的数据看,不同列的数值跨度差得挺多(比如0.1列在1-2.6之间,0.3列在3-7.8之间),如果目标列的数值范围和某测试列差距很大,可能会让相关性结果偏离你的预期——不过从现有数据看,各列和索引(10000、20000这些)的线性关系极强,要是你把索引当目标列,相关性应该接近1才对,是不是你的目标列是其他数据呀?
- 缺失值的干扰:你的0.5列数据有省略(
...),如果存在缺失值,pandas计算相关性时会自动删掉缺失值所在的行,样本量变了,结果自然也会受影响。 - 换个相关方法试试:如果数据是非线性的,换成斯皮尔曼等级相关(
method='spearman')或者肯德尔tau相关(method='kendall'),这俩对非线性关系的捕捉更靠谱。
筛选与目标列匹配度最高的列的方法
假设你的目标列叫target_col,按下面的步骤来就行:
- 计算所有测试列与目标列的相关性
# 要是目标列不在df里,你可以单独传入目标列的Series数据 corr_scores = df.corrwith(df['target_col']) # 默认皮尔逊,想换方法加参数:method='spearman'
- 找出匹配度最高的列
# 取绝对值最大的,毕竟负相关也是一种强关联(如果你的场景允许的话) top_matching_col = corr_scores.abs().idxmax() top_corr_value = corr_scores[top_matching_col] print(f"和目标列匹配度最高的列是: {top_matching_col},相关性为: {top_corr_value:.4f}")
- 用其他指标衡量匹配度(可选)
要是线性相关性不够准确,还可以用均方误差(MSE)来衡量数值差异——MSE越小,说明两列数据越接近:
from sklearn.metrics import mean_squared_error mse_scores = {} for col in df.columns: if col != 'target_col': mse_scores[col] = mean_squared_error(df['target_col'], df[col]) # 找MSE最小的列 top_matching_col_mse = min(mse_scores, key=mse_scores.get) print(f"MSE最小的匹配列是: {top_matching_col_mse},MSE值为: {mse_scores[top_matching_col_mse]:.4f}")
内容的提问来源于stack exchange,提问作者Nic
相关产品推荐
相关产品推荐

