如何结合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']))无法运行的原因:
agg需要接收可调用的函数对象,而pearsonr(['C','D'])是直接执行函数,并非传递函数引用pearsonr要求两个独立的序列参数,不能直接通过列名列表传递参数
内容的提问来源于stack exchange,提问作者sos.cott
相关产品推荐
相关产品推荐

