为什么SciPy ttest_rel返回numpy ndarray的值为NaN?

7kqas0il  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(188)

我尝试使用scipy.stats中的ttest_rel来计算存储在不同 Dataframe 中的数据的t检验分数。但是在计算相同数据之间的t检验时,它返回的是一个numpy ndarray的NaN而不是一个NaN。我做错了什么,我得到的是一个numpy数组而不是一个值?
我的代码和示例 Dataframe 如下所示:
第一个

nqwrtyyt

nqwrtyyt1#

这里的问题实际上与scipy无关,而是由于 Dataframe 中的重复列标签造成的。

_df = pd.merge(df_dict[clm1], df_dict[clm2], 
                          how='inner', on='metro', suffixes=[f'_{clm1}', f'_{clm2}'])

clm1clm2相等时(假设它们都是NHL),您会得到如下_df Dataframe :

metro  total_ratio_NHL  total_ratio_NHL
0     NewYork             0.45             0.45
1  LosAngeles             0.51             0.51
2     StLouis             0.62             0.62
3     Detroit             0.43             0.43
4      Boston             0.26             0.26
5   Baltimore             0.32             0.32

然后,当您将数据行传递给ttest_rel函数时,当您指涉单一数据行标签时,会同时传递两个数据行,因为它们具有相同的标签:

ttest_rel(_df[f"total_ratio_{clm1}"], _df[f"total_ratio_{clm2}"])

这就是你如何得到两个t统计量和两个p值。
因此,您可以修改这两行以消除重复的列标签,如下所示:

_df = pd.merge(df_dict[clm1], df_dict[clm2], 
                          how='inner', on='metro', suffixes=[f'_{clm1}_1', f'_{clm2}_2'])
        _pval = ttest_rel(_df[f"total_ratio_{clm1}_1"], _df[f"total_ratio_{clm2}_2"])[1]

结果将如下所示:

NHL         NBA         MLB         NFL
NHL      NaN    0.589606    0.826298    0.384930
NBA 0.589606         NaN    0.779387    0.782173
MLB 0.826298    0.779387         NaN    0.713229
NFL 0.384930    0.782173    0.713229         NaN

相关问题