pandas.DataFrame.corr()默认计算皮尔逊相关系数,自动处理NaN并要求数值型数据;常见问题包括全NaN列(因全缺失或零方差)、非数值类型被跳过;需确保dtype为float64/int64,缺失过多时慎用;scipy.stats.pearsonr()更灵活但需手动对齐剔除NaN,并返回r值与p值。

用 pandas.DataFrame.corr() 算皮尔逊相关系数最直接
默认就是皮尔逊(Pearson),只要数据是数值型、无太多缺失,corr() 一行就能出结果。它本质调的是 numpy.corrcoef(),但封装得更稳,自动处理 NaN(默认按成对删除)。
常见错误现象:corr() 返回全 NaN 列 —— 很可能是某列全为缺失值或方差为 0(比如全是同一个数);也可能是列类型是 object,pandas 自动跳过,结果里压根不出现该列。
- 确保目标列是数值类型:
df['col'].dtype应为float64或int64,否则先pd.to_numeric(df['col'], errors='coerce') - 检查缺失值比例:超过一半缺失时,相关系数波动大,参考价值低
- 若想改变缺失值处理方式,用
min_periods=10控制最小有效配对数,避免因个别缺失就整列失效
手动调 scipy.stats.pearsonr() 更灵活,但要自己配对
当你要算两个特定变量之间相关性、同时需要 p 值、或者想控制配对逻辑(比如强制用完整观测集),pearsonr() 是更透明的选择。但它不接受含 NaN 的数组,也不会自动对齐索引 —— 这是新手最容易卡住的地方。
使用场景:做假设检验、画散点图前快速验证线性强度、调试某两列异常相关时。
- 必须先对齐并剔除缺失:用
mask = ~df['x'].isna() & ~df['y'].isna(),再传df['x'][mask]和df['y'][mask] -
pearsonr()返回元组:(r_value, p_value),别只取第一个还忘了解包 - 样本量
相关系数接近 ±1 却没意义?警惕非线性关系和离群值
皮尔逊只衡量线性相关。如果散点图呈抛物线、环状或明显有离群点,r 可能高得误导人,也可能被拉低到接近 0。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
性能影响不大,但解读成本极高 —— 很多人算完一个数字就下结论,跳过了可视化这步。
- 永远搭配散点图:
df.plot.scatter('x', 'y'),一眼看出趋势形态 - 用
df[['x','y']].describe()快速扫一眼标准差和极值,判断是否存在强离群点 - 若怀疑非线性,试试
scipy.stats.spearmanr()(秩相关)或sklearn.metrics.mutual_info_score()(互信息)
多列批量计算后,怎么快速筛选强相关变量对
直接看热力图太慢,也难定位具体哪几对。用布尔索引 + unstack() 是最实用的提取方式,比循环 or itertools.combinations 清晰得多。
容易踩的坑:相关矩阵是对称的,上三角和下三角重复;另外 abs(r) > 0.7 这种阈值在小样本下极易误判。
- 先生成相关矩阵:
corr_matrix = df.corr(method='pearson') - 提取上三角(去重):
upper = corr_matrix.where(np.triu(np.ones(corr_matrix.shape), k=1).astype(bool)) - 转长格式并过滤:
upper.stack().abs().sort_values(ascending=False).head(10) - 注意:若 df 有 100 列,相关对数是 ~5000,别用
corrwith()循环单列比对,效率低且易出错
皮尔逊相关系数本身很简单,难的是确认它适用的前提——线性、正态倾向、无强离群、变量间无隐藏分组。算之前花三十秒看分布,比跑十次 corr() 有用得多。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










