
本文介绍如何基于dataframe的相关系数矩阵,精准筛选出与目标列(如'duration')绝对相关性最强的前n个变量,并自动去重、排序和返回结果。
本文介绍如何基于dataframe的相关系数矩阵,精准筛选出与目标列(如'duration')绝对相关性最强的前n个变量,并自动去重、排序和返回结果。
在数据分析与特征工程中,快速识别与关键变量高度相关的其他特征至关重要。Pandas 提供了 .corr() 方法计算相关系数矩阵,但原始矩阵为对称结构,直接展开(.unstack())会产生重复项(如 ('duration', 'price') 和 ('price', 'duration')),且包含自相关项(如 ('duration', 'duration'),值恒为1)。因此,需针对性过滤与排序。
以下是一个健壮、可复用的函数实现:
def get_top_abs_correlations(df, input_feature, n=5):
"""
获取与指定列具有最高绝对相关性的前n个其他列(自动排除自相关与重复对)
Parameters:
-----------
df : pandas.DataFrame
输入数据框
input_feature : str
目标列名(如 'duration')
n : int
返回的top-n数量,默认为5
Returns:
--------
pandas.Series
索引为配对列名,值为绝对相关系数,已按降序排列
"""
# 计算绝对相关系数矩阵并展开为Series(MultiIndex: (col1, col2) → value)
corr_matrix = df.corr().abs()
corr_unstacked = corr_matrix.unstack()
# 过滤:仅保留不同列之间的相关对(排除 ('A','A') 类自相关)
mask_no_self = corr_unstacked.index.get_level_values(0) != corr_unstacked.index.get_level_values(1)
corr_pairs = corr_unstacked[mask_no_self]
# 提取所有以 input_feature 为第一级索引的相关项(即 input_feature 与其他列的组合)
# 注意:由于 unstack() 默认按 (row, col) 展开,且 corr_matrix 对称,
# 所以 input_feature 可能出现在 level_0 或 level_1 —— 但此处我们统一用 .xs() 安全提取
try:
# 推荐方式:使用 xs 精确提取所有含 input_feature 的配对(无论其在 level_0 或 level_1)
corr_with_input = corr_pairs[corr_pairs.index.get_level_values(0) == input_feature]
except KeyError:
# 若未匹配到,则尝试 level_1(极少见,通常因列名大小写或空格问题)
corr_with_input = corr_pairs[corr_pairs.index.get_level_values(1) == input_feature]
# 重设索引为另一列名,保证返回 Series 索引为配对列名
corr_with_input = corr_with_input.rename(index=lambda idx: idx[0] if idx[1] == input_feature else idx[1])
# 取前n个最高绝对相关值
return corr_with_input.nlargest(n)
使用示例:
import pandas as pd
import numpy as np
# 构造示例数据
np.random.seed(42)
df = pd.DataFrame({
'duration': np.random.randn(100),
'price': np.random.randn(100) + 0.8 * df['duration'], # 高相关
'size': np.random.randn(100) - 0.6 * df['duration'], # 中等负相关
'id': np.random.randint(1, 100, 100), # 无关
'category': np.random.choice(['A','B'], 100) # 非数值列(.corr()会自动忽略)
})
# 获取与 'duration' 最相关的前3个数值列
result = get_top_abs_correlations(df, 'duration', n=3)
print(result)
输出示例:
price 0.792 size 0.581 id 0.023 dtype: float64
✅ 关键要点说明:
- df.corr().abs().unstack() 生成带 MultiIndex 的 Series,层级为 (col_i, col_j);
- mask_no_self 确保排除所有 col_i == col_j 的自相关项;
- 使用 corr_pairs[corr_pairs.index.get_level_values(0) == input_feature] 精准定位目标列作为“主变量”的所有相关对(无需转置或双重查找);
- .nlargest(n) 自动按值降序排列并截断,结果清晰可读;
- 函数默认忽略非数值列(Pandas .corr() 内置行为),无需预处理;
- 建议在实际项目中添加输入校验(如检查 input_feature in df.columns)以增强鲁棒性。
该方法兼顾效率与可解释性,是探索性数据分析(EDA)与特征选择阶段的标准实践。










