理解 pandas.DataFrame.corrwith 列式和行式 spearman 秩相关计算的方法

Understanding pandas.DataFrame.corrwith method for spearman rank correlation calculation column-wise and row-wise

我有两个这样的数据框:

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

并且想要计算跨列和跨行的斯皮尔曼等级相关值:

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?

问题三:一般情况下,为什么会得到nan个值?我的输入数据帧中都有实数。

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

问题2和3: 上述问题不适用于您的第二个示例,但您在 tgts_df 的最后一列中有具有相同值 (0.0) 的观察结果,这导致了所谓的并列排名(参见 more here).一般在三种情况下要得到NaN个值:

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

2.数据中存在联系(具有相同值的观察值)。

3.两个dataframe对象的形状不一样。

如果您有任何进一步的 issues/questions,请随时在 CrossValidated 上提问。