【Pandas】pandas DataFrame corrwith

Pandas2.2 DataFrame

Computations descriptive stats

方法 描述
DataFrame.abs() 用于返回 DataFrame 中每个元素的绝对值
DataFrame.all([axis, bool_only, skipna]) 用于判断 DataFrame 中是否所有元素在指定轴上都为 True
DataFrame.any(*[, axis, bool_only, skipna]) 用于判断 DataFrame 中是否至少有一个元素在指定轴上为 True
DataFrame.clip([lower, upper, axis, inplace]) 用于截断(限制)DataFrame 中的数值
DataFrame.corr([method, min_periods, …]) 用于计算 DataFrame 中各列之间的相关系数矩阵(Correlation Matrix)
DataFrame.corrwith(other[, axis, drop, …]) 用于计算当前 DataFrame 的每一列(或行)与另一个 Series 或 DataFrame 中对应列的相关系数

pandas.DataFrame.corrwith()

pandas.DataFrame.corrwith() 方法用于计算当前 DataFrame 的每一列(或行)与另一个 Series 或 DataFrame 中对应列的相关系数。它类似于 corr(),但不是计算 DataFrame 内部各列之间的相关性,而是将 DataFrame 与外部数据进行配对相关分析。


一、方法签名
DataFrame.corrwith(other, axis=0, drop=False, method='pearson', numeric_only=False)
参数说明:
参数 类型 描述
other Series 或 DataFrame 要与当前 DataFrame 进行相关性比较的外部数据对象。若为 Series,则与每列计算相关性;若为 DataFrame,则按列名匹配并逐列计算。
axis {0/‘index’, 1/‘columns’}, 默认 0 指定配对方式:
  • 0 表示按列配对(默认)
  • 1 表示按行配对(要求索引相同) |
    | drop | bool, 默认 False | 若为 True,则自动删除无法匹配的列(或行),避免返回 NaN。 |
    | method | {‘pearson’, ‘kendall’, ‘spearman’},默认 'pearson' | 相关系数的计算方法:
  • 'pearson': 线性相关系数
  • 'kendall': Kendall Tau 秩相关
  • 'spearman': Spearman 秩相关 |
    | numeric_only | bool, 默认 False | 是否只考虑数值类型列(如 int、float)。若为 True,忽略布尔、字符串等非数值列。 |

二、返回值
  • 返回一个 Series,表示当前 DataFrame 的每一列(或行)与 other 对应项的相关系数。
  • other 是 DataFrame,且某些列在当前 DataFrame 中不存在,则这些列的结果为 NaN(除非设置 drop=True)。

三、使用示例及结果
示例1:DataFrame 与 Series 计算相关性
import pandas as pd

df = pd.DataFrame({
    'A': [1, 2, 3, 4, 5],
    'B': [2, 4, 6, 8, 10],
    'C': [5, 4, 3, 2, 1]
})

s = pd.Series([1, 2, 3, 4, 5], name='Target')

result = df.corrwith(s)
print(result)

输出:

A       1.0
B       1.0
C      -1.0
dtype: float64

解释:

  • 列 A 与目标变量完全正相关(+1)
  • 列 C 与目标变量完全负相关(-1)

示例2:DataFrame 与另一个 DataFrame 配对计算相关性
df1 = pd.DataFrame({
    'X': [1, 2, 3],
    'Y': [4, 5, 6],
    'Z': [7, 8, 9]
})

df2 = pd.DataFrame({
    'X': [10, 20, 30],
    'Y': [40, 50, 60],
    'W': [70, 80, 90]  # 不在 df1 中
})

result = df1.corrwith(df2, method='pearson')
print(result)

输出:

X    1.0
Y    1.0
Z    NaN
dtype: float64

解释:

  • 列 X 和 Y 在两个 DataFrame 中都存在,因此计算出相关系数。
  • 列 Z 在 df2 中没有匹配列 → 结果为 NaN

示例3:设置 drop=True 删除不匹配项
result = df1.corrwith(df2, drop=True)
print(result)

输出:

X    1.0
Y    1.0
dtype: float64

解释:

  • 自动删除了不匹配的列 Z。

示例4:按行计算相关性(axis=1
df1 = pd.DataFrame({
    'A': [1, 2, 3],
    'B': [4, 5, 6]
}, index=['Row1', 'Row2', 'Row3'])

df2 = pd.DataFrame({
    'A': [10, 20, 30],
    'B': [40, 50, 60]
}, index=['Row1', 'Row2', 'Row3'])

# 按行计算相关性
result = df1.corrwith(df2, axis=1)
print(result)

输出:

Row1    1.0
Row2    1.0
Row3    1.0
dtype: float64

解释:

  • 每一行在两个 DataFrame 中都匹配,且数据线性相关,所以相关系数为 +1。

示例5:使用 Spearman 方法
result = df.corrwith(s, method='spearman')
print(result)

输出:

A     1.0
B     1.0
C    -1.0
dtype: float64

解释:

  • 因为数据是单调递增/递减,Spearman 与 Pearson 结果一致。

示例6:仅保留数值列(numeric_only=True
df_mixed = pd.DataFrame({
    'A': [1, 2, 3],
    'B': ['low', 'medium', 'high'],
    'C': [4.0, 5.0, 6.0]
})

s = pd.Series([1, 2, 3], name='Target')

result = df_mixed.corrwith(s, numeric_only=True)
print(result)

输出:

A    1.0
C    1.0
dtype: float64

解释:

  • 列 B 是字符串类型,被自动忽略。

四、适用场景
场景 描述
特征与目标变量相关性分析 分析每个特征与目标变量之间的相关性,辅助特征选择。
多数据源对比分析 比较两个不同数据集之间相同字段的相关性,判断数据一致性。
时间序列分析 将时间序列数据与参考序列进行相关性分析,识别趋势相似性。
模型诊断 检查预测值与真实值之间的相关性,评估模型性能。

五、注意事项
  • 只适用于数值型列(int、float),非数值列默认参与运算时会报错(除非设置 numeric_only=True
  • 支持传入任意两个 Series 的函数进行自定义相关性计算(通过 method 参数)
  • 对异常值敏感(尤其 Pearson),建议先做标准化或去极值处理
  • other 是 DataFrame,要求其索引与当前 DataFrame 匹配(否则会产生 NaN)

六、总结
特性 描述
功能 计算当前 DataFrame 的每一列(或行)与另一个 Series 或 DataFrame 的相关性
默认方法 Pearson 线性相关系数
支持方法 Pearson、Kendall、Spearman
是否修改原数据 否,返回新 Series
适用类型 数值型列(int、float)
灵活性 支持 Series 或 DataFrame 输入,可按行或列配对

corrwith() 是一个非常实用的方法,特别适合用于跨数据集的相关性分析、特征与目标变量关系探索等任务。

你可能感兴趣的:(DataFrame,pandas)