我尝试使用scipy.stats中的ttest_rel来计算存储在不同 Dataframe 中的数据的t检验分数。但是在计算相同数据之间的t检验时,它返回的是一个numpy ndarray的NaN而不是一个NaN。我做错了什么,我得到的是一个numpy数组而不是一个值?我的代码和示例 Dataframe 如下所示:第一个
scipy.stats
ttest_rel
nqwrtyyt1#
这里的问题实际上与scipy无关,而是由于 Dataframe 中的重复列标签造成的。
scipy
_df = pd.merge(df_dict[clm1], df_dict[clm2], how='inner', on='metro', suffixes=[f'_{clm1}', f'_{clm2}'])
当clm1和clm2相等时(假设它们都是NHL),您会得到如下_df Dataframe :
clm1
clm2
NHL
_df
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
1条答案
按热度按时间nqwrtyyt1#
这里的问题实际上与
scipy
无关,而是由于 Dataframe 中的重复列标签造成的。当
clm1
和clm2
相等时(假设它们都是NHL
),您会得到如下_df
Dataframe :然后,当您将数据行传递给
ttest_rel
函数时,当您指涉单一数据行标签时,会同时传递两个数据行,因为它们具有相同的标签:这就是你如何得到两个t统计量和两个p值。
因此,您可以修改这两行以消除重复的列标签,如下所示:
结果将如下所示: