pandas.DataFrame.corr()对两列数值数据返回2×2相关矩阵,对角线为1.0,非对角线为皮尔逊系数;若得NaN,主因是缺失值或非数值数据,需清洗并指定method(如'spearman');结果须结合可视化解读。

直接用 pandas.DataFrame.corr(),但必须确保两列都是数值型,否则会静默丢弃非数值列或报错。
为什么 corr() 返回的不是 2×2 矩阵?
当你只传入两列(比如 df[['col_a', 'col_b']])调用 corr(),它确实返回一个 2×2 DataFrame,对角线是 1.0(自己和自己的相关性),非对角线才是你要的皮尔逊相关系数。但容易误以为“没算出来”,其实是结果太小被忽略——尤其当列名含空格或特殊字符时,DataFrame 打印可能截断。
- 检查输出形状:
df[['a','b']].corr().shape应该是(2, 2) - 显式取值更可靠:
df[['a','b']].corr().iloc[0,1]或df['a'].corr(df['b']) - 如果得到
NaN,大概率是其中一列含大量缺失值或全为非数字(如字符串'N/A')
corr() 默认只支持皮尔逊,但你可能需要斯皮尔曼或肯德尔
默认 method='pearson' 要求线性关系且对异常值敏感;若数据偏态、有离群点或只是排序相关,应换方法。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- 斯皮尔曼(秩相关):
df[['a','b']].corr(method='spearman') - 肯德尔:
df[['a','b']].corr(method='kendall') - 注意:
method参数不接受缩写,写'spear'会报ValueError: method must be 'pearson', 'spearman', or 'kendall' - 三者计算开销不同:皮尔逊最快,肯德尔最慢(尤其大数据量),斯皮尔曼居中
常见错误:列里混着字符串、布尔值或缺失值处理不当
corr() 遇到非数值类型会直接跳过整列(不报错),导致你以为“算出来了”,其实用了空数据;而 NaN 默认按 min_periods=1 处理,但若两列有效配对数不足,仍返回 NaN。
- 先清洗:
df[['a','b']] = df[['a','b']].apply(pd.to_numeric, errors='coerce') - 检查缺失情况:
df[['a','b']].isna().sum() - 控制最小有效对数:
df[['a','b']].corr(min_periods=10)(少于 10 对就填NaN) - 布尔列会被自动转成 0/1 参与计算,通常没问题,但需确认业务含义是否合理
真正容易被忽略的是:相关系数不等于因果,也不代表线性拟合效果好——即使 r = 0.9,散点图也可能是完美圆弧;算完务必可视化,别只盯数字。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










