我有一个带有x,y和z列的csv文件,它们代表三维空间中的坐标。我需要从每个项目创建一个距离矩阵,而不是所有其他项目。
我可以使用pandas read_csv函数轻松读取csv,从而产生如下的DataFrame:
import pandas as pd
import numpy as np
samples = pd.DataFrame(
columns=['source', 'name', 'x', 'y', 'z'],
data = [['a', 'apple', 1.0, 2.0, 3.0],
['b', 'pear', 2.0, 3.0, 4.0],
['c', 'tomato', 9.0, 8.0, 7.0],
['d', 'sandwich', 6.0, 5.0, 4.0]]
)
然后我可以将单独的x,y,z列转换为一系列元组:
samples['coord'] = samples.apply(
lambda row: (row['x'], row['y'], row['z']),
axis=1
)
或一系列清单:
samples['coord'] = samples.apply(
lambda row: [row['x'], row['y'], row['z']],
axis=1
)
但是我无法创建一系列数组:
samples['coord'] = samples.apply(
lambda row: np.array([row['x'], row['y'], row['z']]),
axis=1
)
我得到了ValueError,“传递值的形状是(4,3),索引暗示(4,6)”
我真的想准备好数据,以便我可以简单地调用scipy的distance_matrix函数,它需要两个数组,如下所示:
dmat = scipy.spatial.distance_matrix(
samples['coord'].values,
samples['coord'].values
)
当然,如果我的方法很差,我会接受任何更多的pythonic或更有效的方法来实现这一目标。
答案 0 :(得分:1)
这将NumPy数组存储在coords
:
samples['coord'] = list(samples[['x', 'y', 'z']].values)
现在:
>>> samples.coord[0]
array([ 1., 2., 3.])
答案 1 :(得分:0)
我发现我可以从数据框中提取一个numpy数组并用它来获取距离矩阵。
sample_array = np.array(samples[['x', 'y', 'z']])
dmat = scipy.spatial.distance_matrix(sample_array, sample_array)
但我仍然希望将这些小数组嵌入到数据框中,与其他数据一起使用,并且我还要投票并接受可以做到这一点的答案。