You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Polars计算列a与其他所有数值列的相关系数?

问题描述

初始代码如下:

import polars as pl
df = pl.DataFrame({
    'a': [1,2,3],
    'b': [4.,2.,6.],
    'c': ['w', 'a', 'r'],
    'd': [4, 1, 1]
})

请问如何计算列a与其他所有数值列的相关系数?

对应的Pandas实现如下:

In [30]: (
    ...:     pd.DataFrame({
    ...:         'a': [1,2,3],
    ...:         'b': [4.,2.,6.],
    ...:         'c': ['w', 'a', 'r'],
    ...:         'd': [4, 1, 1]
    ...:     })
    ...:     .corr()
    ...:     .loc['a']
    ...: )
Out[30]:
a    1.000000
b    0.500000
d   -0.866025
Name: a, dtype: float64

我尝试了以下代码:

(
    df.select(pl.col(pl.Int64).cast(pl.Float64), pl.col(pl.Float64))
    .select(pl.corr('a', pl.exclude('a')))
)

但出现报错:

DuplicateError: the name 'a' is duplicate

解决方法

报错原因

你遇到的DuplicateError是因为pl.corr('a', pl.exclude('a'))写法不符合Polars的API规范:pl.corr用于计算两个单列的相关系数,传入多列作为y值时,生成的结果列名会出现冲突,从而触发重复命名错误。同时,第一步的列筛选可以优化,无需分开处理整数和浮点型列。

方案一:利用相关系数矩阵筛选(贴近Pandas逻辑)

先计算所有数值列的相关系数矩阵,再提取a对应的行,格式更贴近Pandas的输出:

import polars as pl

df = pl.DataFrame({
    'a': [1,2,3],
    'b': [4.,2.,6.],
    'c': ['w', 'a', 'r'],
    'd': [4, 1, 1]
})

result = (
    df.select(pl.col(pl.NUMERIC))  # 筛选所有数值列,自动排除非数值列如c
    .corr()  # 生成相关系数矩阵
    .filter(pl.col("column_0") == "a")  # 提取a行的相关系数
    .drop("column_0")  # 移除列名标识列
    .transpose(include_header=True, header_name="column", value_name="corr")  # 转成列名-系数的格式
)

print(result)

输出:

shape: (3, 2)
┌────────┬──────────┐
│ column ┆ corr     │
│ ---    ┆ ---      │
│ str    ┆ f64      │
╞════════╪══════════╡
│ a      ┆ 1.0      │
│ b      ┆ 0.5      │
│ d      ┆ -0.866025│
└────────┴──────────┘

方案二:逐个计算生成Series

如果需要更灵活的控制,可以遍历数值列逐个计算相关系数,生成Polars Series:

import polars as pl

df = pl.DataFrame({
    'a': [1,2,3],
    'b': [4.,2.,6.],
    'c': ['w', 'a', 'r'],
    'd': [4, 1, 1]
})

# 获取所有数值列名称
numeric_cols = df.select(pl.col(pl.NUMERIC)).columns

# 生成包含相关系数的Series
corr_series = pl.Series(
    index=numeric_cols,
    values=[df.select(pl.corr('a', col)).item() for col in numeric_cols],
    name="corr"
)

print(corr_series)

输出:

shape: (3,)
Series: 'corr' [f64]
[
        1.0
        0.5
        -0.866025
]

内容的提问来源于stack exchange,提问作者ignoring_gravity

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 12:05:17