了解pandas.DataFrame.corrwith方法用于按行和按行排列Spearman等级相关性

时间:2019-12-22 21:33:53

标签: pandas dataframe nan

我有两个这样的数据框:

preds_df = pd.DataFrame.from_records ([[ 0.8224],  [ 0.7982]]) 
tgts_df = pd.DataFrame.from_records ([[0.8889], [1.0000]])

,并希望计算跨列和跨行的spearman等级相关值:

col_wise = preds_df.corrwith(tgts_df,method='spearman',axis=0).values.tolist()
row_wise = preds_df.corrwith(tgts_df,method='spearman',axis=1).values.tolist()

打印这些值将给出:

print(col_wise)
[-0.9999999999999999]
print(row_wise)
[nan, nan]

问题1: col_wise产生了一些结果,但是row_wise对每一行产生nan的结果是给定的,因为每一行仅包含一列,并且获得的值col_wise不是nan吗?

如果我进一步扩展这些数据集(保留原始列,但再添加两列),这样

preds_df = pd.DataFrame.from_records ([[0.8224,  0.5371,  0.1009],  [0.7982,  0.5890,  0.0962]])
tgts_df = pd.DataFrame.from_records ([[0.8889, 0.5556, 0.0000], [1.0000, 0.7778, 0.0000]])

获得的值是:

col_wise = preds_df.corrwith(tgts_df,method='spearman',axis=0).values.tolist()
print(col_wise)
[-0.9999999999999999, 0.9999999999999999, nan]

row_wise = preds_df.corrwith(tgts_df,method='spearman',axis=1).values.tolist()
print(row_wise)
[1.0, 1.0]

问题2:尽管构成每一行的一列(第三列)产生了row_wise,但nan为什么不包含nancol_wise中?

问题3:通常,为什么会获得nan值?我的输入数据帧中都有实数。

1 个答案:

答案 0 :(得分:1)

问题1: 请注意,当您要逐行计算Spearman相关系数时,您会从两个帧(0.8224, 0.8889)中得到两个单元素样本,它们与系数列表中的第一个元素和(0.7982,1.0000)相对应对应于另一个。现在来看formula的系数。因为您在两个样本中都有一个观测值,所以分母等于零,这就是为什么获得NaN值的原因。

问题2和3: 上面的问题不适用于您的第二个示例,但是您在0.0的最后一列中观察到的值(tgts_df)相同,这导致所谓的并列秩(请参阅{{3} }。通常,在三种情况下要获取NaN值:

1。。您的样本中每个组中只有一个元素。

2。。数据中存在联系(观测值相同)。

3。。两个数据框对象的形状不同。

如果您还有其他问题/疑问,请随时在more here上提问。