【Pandas】pandas DataFrame corr
Pandas2.2 DataFrame
Computations descriptive stats
| 方法 | 描述 | 
|---|---|
| DataFrame.abs() | 用于返回 DataFrame 中每个元素的绝对值 | 
| DataFrame.all([axis, bool_only, skipna]) | 用于判断 DataFrame 中是否所有元素在指定轴上都为 True | 
| DataFrame.any(*[, axis, bool_only, skipna]) | 用于判断 DataFrame 中是否至少有一个元素在指定轴上为 True | 
| DataFrame.clip([lower, upper, axis, inplace]) | 用于截断(限制)DataFrame 中的数值 | 
| DataFrame.corr([method, min_periods, …]) | 用于计算 DataFrame 中各列之间的相关系数矩阵(Correlation Matrix) | 
pandas.DataFrame.corr()
pandas.DataFrame.corr() 方法用于计算 DataFrame 中各列之间的相关系数矩阵(Correlation Matrix),常用于探索变量之间的线性关系强度。默认使用皮尔逊相关系数(Pearson),也支持 Kendall 和 Spearman 等非参数方法。
一、方法签名
DataFrame.corr(method='pearson', min_periods=1, numeric_only=False)
 
参数说明:
| 参数 | 类型 | 描述 | 
|---|---|---|
method | {‘pearson’, ‘kendall’, ‘spearman’} 或 callable,默认 'pearson' | 相关系数的计算方法: | 
'pearson': 线性相关系数(适用于连续变量)'kendall': Kendall Tau 秩相关系数'spearman': Spearman 秩相关系数- 也可以传入自定义函数(两个 Series 输入,返回 float) |
|min_periods| int, 默认1| 每对列之间至少需要多少个有效观测值才能计算相关系数。若不足则返回 NaN。 |
|numeric_only| bool, 默认False| 是否只考虑数值类型列(如 int、float)。若为True,忽略布尔、字符串等非数值列。 | 
二、返回值
- 返回一个 DataFrame,表示每对列之间的相关系数,范围在 [-1, 1] 之间: 
1表示完全正相关0表示无线性关系-1表示完全负相关
 
三、相关系数方法说明
| 方法 | 描述 | 
|---|---|
'pearson' | 衡量两变量之间的线性相关性(适合连续数据) | 
'kendall' | 基于秩次的相关性检验(适合小样本或有序数据) | 
'spearman' | 基于秩次的非参数相关性(适合非正态分布数据) | 
四、使用示例及结果
示例1:默认方法(Pearson)
import pandas as pddf = pd.DataFrame({'A': [1, 2, 3, 4, 5],'B': [2, 4, 6, 8, 10],'C': [5, 4, 3, 2, 1]
})
 
计算 Pearson 相关系数:
result = df.corr()
print(result)
 
输出:
          A         B         C
A  1.000000  1.000000 -1.000000
B  1.000000  1.000000 -1.000000
C -1.000000 -1.000000  1.000000
 
解释:
- 列 A 与 B 完全正相关(+1)
 - 列 A 与 C 完全负相关(-1)
 
示例2:使用 Spearman 方法
result = df.corr(method='spearman')
print(result)
 
输出:
     A    B    C
A  1.0  1.0 -1.0
B  1.0  1.0 -1.0
C -1.0 -1.0  1.0
 
解释:
- 由于数据是单调递增/递减,Spearman 与 Pearson 结果一致。
 
示例3:包含 NaN 值时设置 min_periods
 
import numpy as npdf_with_nan = pd.DataFrame({'X': [1, 2, np.nan, 4, 5],'Y': [np.nan, 2, 3, 4, 5],'Z': [5, 4, 3, 2, 1]
})# 设置 min_periods=3
result = df_with_nan.corr(min_periods=3)
print(result)
 
输出:
          X         Y         Z
X  1.000000  1.000000 -1.000000
Y  1.000000  1.000000 -1.000000
Z -1.000000 -1.000000  1.000000
 
解释:
- 虽然有缺失值,但每对列间仍有足够的有效观测值(≥3),因此仍能计算出相关系数。
 
示例4:使用自定义相关函数(如互信息)
from scipy.stats import pearsonrdef custom_corr(x, y):return pearsonr(x, y)[0]result = df.corr(method=custom_corr)
print(result)
 
输出:
          A         B         C
A  1.000000  1.000000 -1.000000
B  1.000000  1.000000 -1.000000
C -1.000000 -1.000000  1.000000
 
解释:
- 使用 
scipy.stats.pearsonr自定义相关函数,效果与默认相同。 
示例5:仅保留数值列(numeric_only=True)
 
df_mixed = pd.DataFrame({'A': [1, 2, 3],'B': ['low', 'medium', 'high'],'C': [4.0, 5.0, 6.0]
})result = df_mixed.corr(numeric_only=True)
print(result)
 
输出:
     A    C
A  1.0  1.0
C  1.0  1.0
 
解释:
- 列 B 是字符串类型,被自动忽略。
 - 只对数值列 A 和 C 进行相关分析。
 
五、适用场景
| 场景 | 描述 | 
|---|---|
| 特征选择 | 分析特征之间的共线性,避免多重共线性问题 | 
| 数据探索 | 快速了解变量之间的线性关系强弱 | 
| 可视化辅助 | 配合热力图(heatmap)展示变量相关性 | 
| 模型诊断 | 检查输入变量是否具有预测能力或冗余性 | 
六、注意事项
- 只适用于数值型列(int、float),非数值列默认参与运算时会报错(除非设置 
numeric_only=True) NaN值会被自动跳过,不影响计算method支持传入任意两个 Series 的函数进行自定义相关性计算- 对异常值敏感(尤其 Pearson),建议先做标准化或去极值处理
 
七、总结
| 特性 | 描述 | 
|---|---|
| 功能 | 计算 DataFrame 各列之间的相关系数矩阵 | 
| 默认方法 | Pearson 线性相关系数 | 
| 支持方法 | Pearson、Kendall、Spearman、自定义函数 | 
| NaN 处理 | 自动跳过,可通过 min_periods 控制最小样本数 | 
| 是否修改原数据 | 否,返回新 DataFrame | 
| 适用类型 | 数值型列(int、float) | 
corr() 是数据分析中非常关键的方法之一,广泛应用于变量关系探索、特征工程、模型优化等多个环节。
