用df['col_a'].corr(df['col_b'])最简单,直接返回单个皮尔逊相关系数;需确保两列为数值型(float64/int64),否则用pd.to_numeric(..., errors='coerce')转换,且自动按成对删除NaN计算。

用 corr() 方法直接算两列相关系数最简单
不需要先提取成数组或调用 numpy.corrcoef(),Pandas 的 Series 和 DataFrame 都内置了 corr() 方法,底层默认用皮尔逊(Pearson)公式,一行就能出结果。
常见错误是误传整个 DataFrame:比如 df.corr() 会返回全矩阵,而你只想要 col_a 和 col_b 之间的一个数值。正确做法是先取两列,再链式调用:
-
df['col_a'].corr(df['col_b'])—— 最常用,返回单个浮点数 - 支持参数
method='spearman'或method='kendall'切换秩相关 - 自动跳过含
NaN的行对(pairwise),不报错也不插值
遇到 TypeError: unsupported operand type(s) for /: 'str' and 'float' 怎么办
这是最典型的报错,说明其中一列数据类型不是数值型(比如字符串、日期、布尔值混入),corr() 无法计算。
检查和修复步骤:
立即学习“Python免费学习笔记(深入)”;
- 用
df[['col_a', 'col_b']].dtypes看类型,确认是否都是float64或int64 - 用
pd.to_numeric(df['col_a'], errors='coerce')强转并把非法值设为NaN - 避免用
.astype(float),它遇到非数字会直接报错 - 如果列里有单位(如
"12.5kg"),得先用.str.extract(r'(\d+\.?\d*)')提数字
想同时算多对列的相关系数,别硬写循环
手动写 for 循环调用 corr() 效率低,还容易漏掉配对逻辑。更稳的方式是构造一个临时 DataFrame 再调 .corr():
df_subset = df[['col_a', 'col_b', 'col_c']] corr_matrix = df_subset.corr() # 返回 3x3 矩阵 print(corr_matrix.loc['col_a', 'col_b']) # 取特定一对
注意:corr_matrix 是对称的,且对角线恒为 1;如果你只要上三角部分(避免重复),可以用 np.triu(corr_matrix, k=1) 配合 mask 过滤。
为什么结果和 Excel / SPSS 不一样
差异通常来自三类原因:
- 缺失值处理:Pandas 默认用 pairwise complete observations(即只剔除当前两列都为
NaN的行),而 Excel 的CORREL()也是同样逻辑,但 SPSS 可能默认 listwise 删除整行 —— 检查你的数据里是否有第三列含NaN却影响了别的列 - 数据类型:Excel 会静默把文本数字当数值,Pandas 不会;务必确认两端输入的是同一组干净数值
- 小样本修正:Pandas 的 Pearson 不做 Bessel 修正(即分母用
n而非n-1),这和大多数统计软件一致,不是 bug
真要验证,拿 3–5 行手算一遍分子分母,比对中间值比看最终结果更有用。


















