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 |。并将结果存储在另一本词典中。
我要这样做,以便稍后计算列的所有组合之间的欧几里得距离。如果有更简单的方法可以做到这一点,我也希望看到它。谢谢。
您可以使用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 个原始数据帧列。