如何用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
相关产品推荐
相关产品推荐

