如何将熊猫系列列表或元组转换为一系列 numpy 数组



我有一个csv文件,其中包含x,y和z列,这些列表示三维空间中的坐标。我需要从每个项目创建一个距离矩阵,而不是所有其他项目。

我可以使用 pandas read_csv 函数轻松读取 csv,从而生成如下所示的数据帧:

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或更有效的方式来实现这一目标。

这将 NumPy 数组存储在 coords 中:

samples['coord'] = list(samples[['x', 'y', 'z']].values)

现在:

>>> samples.coord[0]
array([ 1.,  2.,  3.])

发现我可以从数据帧中提取一个 numpy 数组并使用它来获取距离矩阵。

sample_array = np.array(samples[['x', 'y', 'z']])
dmat = scipy.spatial.distance_matrix(sample_array, sample_array)

但我仍然希望将这些小数组与其他数据一起嵌入到数据帧中,我会投票并接受可以做到这一点的答案。

最新更新