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

如何结合Pandas Groupby计算Pearsonr及相关性显著性?

Pandas分组结合scipy.pearsonr计算相关性及显著性

你目前通过以下代码实现了分组相关性计算,但只能得到相关系数:

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randint(0,10,size=(1000, 4)), columns=list('ABCD'))
df.groupby(['A','B'])[['C','D']].corr().unstack().iloc[:,1]

想要利用scipy.stats.pearsonr同时获取相关性系数和显著性p值,但你尝试的corr,val=df.groupby(['A','B']).agg(pearsonr(['C','D']))写法无法正常运行,以下是正确的实现方式:


正确实现方案

pearsonr需要接收两个独立序列作为输入,且返回两个结果值,因此需要通过自定义函数来适配分组逻辑,这里提供两种常用方法:

方法1:使用groupby.apply(推荐,直观清晰)

import pandas as pd
import numpy as np
from scipy.stats import pearsonr

# 生成测试数据
df = pd.DataFrame(np.random.randint(0,10,size=(1000, 4)), columns=list('ABCD'))

# 自定义处理函数:接收每组数据,返回相关系数和p值
def calc_pearson_stats(group):
    corr_coef, p_val = pearsonr(group['C'], group['D'])
    return pd.Series([corr_coef, p_val], index=['correlation', 'p_value'])

# 分组计算并返回结果
grouped_result = df.groupby(['A','B']).apply(calc_pearson_stats)
print(grouped_result)

运行后会得到一个以A、B为多级索引,包含correlation(相关系数)和p_value(显著性)两列的DataFrame,可直接查看每组的统计结果。

方法2:使用groupby.agg结合匿名函数

如果追求简洁写法,也可以通过匿名函数配合agg实现,但需要通过索引匹配对应列的数据:

grouped_result = df.groupby(['A','B']).agg(
    correlation=('C', lambda x: pearsonr(x, df.loc[x.index, 'D'])[0]),
    p_value=('C', lambda x: pearsonr(x, df.loc[x.index, 'D'])[1])
)
print(grouped_result)

错误写法说明

你之前尝试的agg(pearsonr(['C','D']))无法运行的原因:

  1. agg需要接收可调用的函数对象,而pearsonr(['C','D'])是直接执行函数,并非传递函数引用
  2. pearsonr要求两个独立的序列参数,不能直接通过列名列表传递参数

内容的提问来源于stack exchange,提问作者sos.cott

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 10:18:32