使用Pandas的corr()遇警告,求替代方法及手动实现方案
Pandas corr() 警告处理及关联关系计算替代方案
先解决FutureWarning警告
你遇到的警告是因为Pandas即将修改corr()的numeric_only默认值,直接指定该参数就能消除警告,同时确保只计算数值列的相关系数:
import pandas as pd df = pd.read_csv('Data.csv') # 指定numeric_only=True,明确只处理数值列 print(df.corr(numeric_only=True))
替代corr()的方法
1. 使用NumPy的corrcoef
Pandas的corr()底层依赖NumPy实现,你可以直接用numpy.corrcoef来计算,需要注意先提取数值列并转置(因为NumPy默认按行处理变量):
import pandas as pd import numpy as np df = pd.read_csv('Data.csv') # 筛选数值列 numeric_cols = df.select_dtypes(include=['number']) # 计算相关系数矩阵,转置后匹配DataFrame的列顺序 corr_matrix = np.corrcoef(numeric_cols.T) # 转换成DataFrame方便查看 corr_df = pd.DataFrame(corr_matrix, index=numeric_cols.columns, columns=numeric_cols.columns) print(corr_df)
2. 使用SciPy的pearsonr(逐对计算)
如果需要更精细地控制每对变量的相关系数计算,可以用scipy.stats.pearsonr,它会返回相关系数和p值:
import pandas as pd from scipy.stats import pearsonr import itertools df = pd.read_csv('Data.csv') numeric_cols = df.select_dtypes(include=['number']).columns corr_results = {} # 遍历所有列对组合 for col1, col2 in itertools.combinations(numeric_cols, 2): corr, p_value = pearsonr(df[col1], df[col2]) corr_results[(col1, col2)] = {'corr': corr, 'p_value': p_value} # 转换成DataFrame展示 corr_df = pd.DataFrame.from_dict(corr_results, orient='index') print(corr_df)
手动实现相关系数计算
可以基于皮尔逊相关系数的公式手动实现,核心是计算协方差和标准差:
皮尔逊相关系数公式:$r = \frac{\text{cov}(X,Y)}{\sigma_X \sigma_Y}$,其中协方差$\text{cov}(X,Y) = \frac{1}{n-1}\sum_{i=1}^{n}(X_i-\bar{X})(Y_i-\bar{Y})$,$\sigma$为样本标准差。
import pandas as pd import numpy as np def manual_corr(df): # 筛选数值列并标准化(减去均值) numeric_df = df.select_dtypes(include=['number']) centered = numeric_df - numeric_df.mean() n = len(centered) # 计算协方差矩阵 cov_matrix = (centered.T @ centered) / (n - 1) # 计算各列的标准差 stds = np.sqrt(np.diag(cov_matrix)) # 计算相关系数矩阵:协方差除以对应标准差的乘积 corr_matrix = cov_matrix / np.outer(stds, stds) return pd.DataFrame(corr_matrix, index=numeric_df.columns, columns=numeric_df.columns) df = pd.read_csv('Data.csv') print(manual_corr(df))
内容的提问来源于stack exchange,提问作者Elixir0101
相关产品推荐
相关产品推荐

