如何计算数据帧中所有行之间的欧几里德距离?我正在尝试此代码,但它不起作用:
zero_data = data
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()
这就是我的(44062 x 278)数据帧的外观:
Tags:
处理你的数据子集,例如
更新
正如评论中指出的,问题是
memory overflow
,因此我们必须分批处理问题要计算数据帧df的两行i和j之间的欧氏距离:
要在连续行之间计算它,即0和1、1和2、2和3
如果要在所有行之间计算它,即0和1,0和2,…,1和1,1和2…,那么必须循环i和j的所有组合(请记住,对于44062行,有970707891个这样的组合,因此使用for循环将非常慢):
编辑:
相反,您可以使用scipy.spatial.distance.cdist计算两个输入集合的每对之间的距离:
这将返回数据帧所有行之间欧几里德距离的对称(44062 x 44062)矩阵。问题是它需要大量内存才能工作(至少8*44062**2字节内存,即约16GB)。 因此,更好的选择是使用pdist
它将返回df行之间所有成对欧几里德距离的数组(大小为970707891)
注意:在计算距离时,不要忘记忽略“实际数据”列。例如,您可以执行以下操作:
data = df.drop('Actual_Data', axis=1).values
然后cdist(data, data, 'euclid')
或pdist(data, 'euclid')
。您还可以创建另一个具有如下距离的数据帧:相关问题 更多 >
编程相关推荐