与熊猫成对的欧几里得距离忽略了NaNs

Jab*_*net 2 python numpy euclidean-distance dataframe pandas

我从字典开始,这是我的数据已经被格式化的方式:

import pandas as pd
dict2 = {'A': {'a':1.0, 'b':2.0, 'd':4.0}, 'B':{'a':2.0, 'c':2.0, 'd':5.0}, 
'C':{'b':1.0,'c':2.0, 'd':4.0}}
Run Code Online (Sandbox Code Playgroud)

然后将其转换为熊猫数据框:

df = pd.DataFrame(dict2)
print(df)
     A    B    C
a  1.0  2.0  NaN
b  2.0  NaN  1.0
c  NaN  2.0  2.0
d  4.0  5.0  4.0
Run Code Online (Sandbox Code Playgroud)

当然,通过这样做,我可以一次获得一个差异:

df['A'] - df['B']
Out[643]: 
a   -1.0
b    NaN
c    NaN
d   -1.0
dtype: float64
Run Code Online (Sandbox Code Playgroud)

我想出了如何遍历和计算AA,AB,AC:

for column in df:
print(df['A'] - df[column])

a    0.0
b    0.0
c    NaN
d    0.0
Name: A, dtype: float64
a   -1.0
b    NaN
c    NaN
d   -1.0
dtype: float64
a    NaN
b    1.0
c    NaN
d    0.0
dtype: float64
Run Code Online (Sandbox Code Playgroud)

我想做的是遍历各列,以便计算| AB |,| AC |和| BC |。并将结果存储在另一本词典中。

我要这样做,以便稍后计算列的所有组合之间的欧几里得距离。如果有更简单的方法可以做到这一点,我也希望看到它。谢谢。

cs9*_*s95 5

您可以使用numpy广播来计算向量化的欧几里得距离(L2-范数),而无需使用NaN np.nansum

i = df.values.T
j = np.nansum((i - i[:, None]) ** 2, axis=2) ** .5
Run Code Online (Sandbox Code Playgroud)

如果您想要一个表示距离矩阵的DataFrame,则如下所示:

df = (lambda v, c: pd.DataFrame(v, c, c))(j, df.columns)
df
          A         B    C
A  0.000000  1.414214  1.0
B  1.414214  0.000000  1.0
C  1.000000  1.000000  0.0
Run Code Online (Sandbox Code Playgroud)

df[i, j]表示第i之间的距离和j 原始数据帧列。