pandas.series.corr()默认计算皮尔逊相关系数,自动按索引对齐并成对删除nan;dataframe.corr()默认整行删除nan,行为不同需注意。

用 pandas.Series.corr() 直接算两列数据的相关系数
只要两个 Series 长度一致、索引对齐(或可自动对齐),corr() 就能直接返回皮尔逊相关系数。它默认用 method='pearson',所以不用额外指定。
常见错误是忽略缺失值处理:如果任一 Series 含 NaN,corr() 默认会 **只保留两个序列都非空的行**(即 pairwise deletion),这和用 numpy.corrcoef() 前手动 dropna() 的结果一致。
- 确保两个
Series索引类型相同(比如都是int64或都为DatetimeIndex),否则可能意外触发广播或对齐失败 - 如果索引不匹配但想强制按位置计算(忽略索引),先用
.values转成numpy.ndarray,再交给scipy.stats.pearsonr() - 注意:空值太多会导致有效样本量骤降,相关系数标准误变大,但
corr()不报 warning
用 DataFrame.corr() 批量计算多列间的皮尔逊矩阵
当你有多个变量(比如一个 DataFrame 里多列数值型数据),corr() 会返回一个方阵,对角线为 1,其余为两两皮尔逊系数。
默认行为是跳过含 NaN 的整行(complete-case deletion),和 Series.corr() 的 pairwise 行为不同 —— 这点容易踩坑。
安全 Python 代码沙箱:在隔离的沙箱中执行任意 Python 代码,预装 requests、NumPy、pandas 库。返回 stdout、stderr。
- 想恢复 pairwise 行为,得先用
df.dropna(how='all')清理全空行,再对每对列手动调用Series.corr() -
corr(method='pearson', min_periods=2)中的min_periods控制最少需几个有效配对才计算;设为None(默认)时,只要有一对非空就尝试算 - 如果某列是
object类型但实际存数字字符串(如'1.5'),corr()会静默跳过该列,不报错也不警告
验证结果是否可信:检查 scipy.stats.pearsonr() 返回的 p 值和置信区间
pandas 的 corr() 只返回系数值,不提供统计显著性信息。要判断这个相关是不是偶然发生的,得用 scipy.stats.pearsonr()。
它返回两个值:correlation 和 pvalue。注意:它要求输入是等长一维数组,且会自动移除 NaN 对(pairwise),和 pandas.Series.corr() 逻辑一致。
- 调用前务必确认两个输入长度相等,否则报
ValueError: x and y must have the same length - 若样本量
n ,<code>pearsonr()会返回(nan, nan),而pandas可能仍返回一个数(比如两个点总能连出一条直线,系数为 ±1) - 需要置信区间?得自己用
scipy.stats.t或scipy.stats.bootstrap()构造,pearsonr()不提供
遇到 TypeError: unsupported operand type(s) for /: 'str' and 'float' 怎么办
这是最常卡住人的报错,本质是某列数据类型为 object,但内容混有字符串和数字,或全是字符串数字(如 '3.14')。corr() 在内部做除法时失败。
别急着用 astype(float) 强转 —— 如果有非法字符(如 'N/A'、'--'),会直接崩。
- 先用
pd.to_numeric(series, errors='coerce')把无法解析的转成NaN,再算相关 - 检查原始数据:用
series.apply(type).unique()看是否真混了类型;用series.str.contains(r'[^0-9.-]', na=False).any()快速扫异常字符 - 如果列名含空格或特殊符号(如
'sales amt'),用df['sales amt'].corr(df['profit'])没问题,但别写成df.sales amt.corr(...)—— 语法错误
r 从 0.2 拉到 0.6。动手算之前,先画个散点图,比看任何数字都管用。Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










