熊猫数据框中行的距离矩阵

熊猫数据框中行的距离矩阵,第1张

熊猫数据框中行的距离矩阵

这里的关键问题是要使用什么距离度量

假设这是您的数据。

>>> import pandas as pd>>> data = pd.Dataframe(pd.np.random.rand(100, 50))>>> data[data > 0.2] = 1>>> data[data <= 0.2] = pd.np.nan>>> data.head()   0   1   2   3   4   5   6   7   8   9  ...  40  41  42  43  44  45  46  47     1   1   1 NaN   1 NaN NaN   1   1   1 ...   1   1 NaN   1 NaN   1   1   11   1   1   1 NaN   1   1   1   1   1   1 ... NaN   1   1 NaN NaN   1   1   12   1   1   1   1   1   1   1   1   1   1 ...   1 NaN   1   1   1   1   1 NaN3   1 NaN   1 NaN   1 NaN   1 NaN   1   1 ...   1   1   1   1 NaN   1   1   14   1   1   1   1   1   1   1   1 NaN   1 ... NaN   1   1   1   1   1   1   1
有什么不同?

您可以将距离度量计算为每列之间不同的值的百分比。结果显示任意两列之间的%差异。

>>> zero_data = data.fillna(0)>>> distance = lambda column1, column2: (column1 - column2).abs().sum() / len(column1)>>> result = zero_data.apply(lambda col1: zero_data.apply(lambda col2: distance(col1, col2)))>>> result.head()     0     1     2     3     4     5     6     7     8     9   ...     40    0.00  0.36  0.33  0.37  0.32  0.41  0.35  0.33  0.39  0.33  ...   0.371  0.36  0.00  0.37  0.29  0.30  0.37  0.33  0.37  0.33  0.31  ...   0.352  0.33  0.37  0.00  0.36  0.29  0.38  0.40  0.34  0.30  0.28  ...   0.283  0.37  0.29  0.36  0.00  0.29  0.30  0.34  0.26  0.32  0.36  ...   0.364  0.32  0.30  0.29  0.29  0.00  0.31  0.35  0.29  0.29  0.25  ...   0.27
相关系数是多少?

在这里,我们使用皮尔逊相关系数。这是一个完全有效的指标。具体来说,在二进制数据的情况下,它转换为phi系数。

>>> zero_data = data.fillna(0)>>> distance = lambda column1, column2: scipy.stats.pearsonr(column1, column2)[0]>>> result = zero_data.apply(lambda col1: zero_data.apply(lambda col2: distance(col1, col2)))>>> result.head()         0         1         2         3         4         5         6     1.000000  0.013158  0.026262 -0.059786 -0.024293 -0.078056  0.0540741  0.013158  1.000000 -0.093109  0.170159  0.043187  0.027425  0.1081482  0.026262 -0.093109  1.000000 -0.124540 -0.048485 -0.064881 -0.1618873 -0.059786  0.170159 -0.124540  1.000000  0.004245  0.184153  0.0425244 -0.024293  0.043187 -0.048485  0.004245  1.000000  0.079196 -0.099834

顺便说一句,这与使用Spearman R系数得到的结果相同。

欧几里得距离是多少?
>>> zero_data = data.fillna(0)>>> distance = lambda column1, column2: pd.np.linalg.norm(column1 - column2)>>> result = zero_data.apply(lambda col1: zero_data.apply(lambda col2: distance(col1, col2)))>>> result.head()         0         1         2         3         4         5         6     0.000000  6.000000  5.744563  6.082763  5.656854  6.403124  5.9160801  6.000000  0.000000  6.082763  5.385165  5.477226  6.082763  5.7445632  5.744563  6.082763  0.000000  6.000000  5.385165  6.164414  6.3245553  6.082763  5.385165  6.000000  0.000000  5.385165  5.477226  5.8309524  5.656854  5.477226  5.385165  5.385165  0.000000  5.567764  5.916080

到现在为止,您已经了解了模式。创建一个

distance
方法。然后将其成对应用于每一列

data.apply(lambda col1: data.apply(lambda col2: method(col1, col2)))

如果您的

distance
方法依赖于零而不是
nan
s,请使用转换为零
.fillna(0)



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5640173.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存