如何在两个列的元素之间应用函数

2024-04-26 11:03:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个需要两个元组的函数输入.for示例:

def mult((x1,y1),(x2,y2)):
    return Eucledeandist((x1,y1),(x2,y2))

我有一个有两列(x,y)的数据框,其中x和y代表一个点的坐标。现在我需要计算数据帧中每个点到其他点的距离。 我是说如果df的长度是n。我需要一个大小为nXn的输出,其中(I,j)th entry是原始数据帧中第I个点和第j个点之间的距离。你知道吗

我怎么用数据框应用函数,而不是有两个for循环?你知道吗

生成数据帧的示例代码类似于我的代码

df = pd.DataFrame({'x':np.random.randint(10, size=6), 'y':np.random.randint(10, size=6)})
df['(x,y)']=list(zip(df.x, df.y))

数据帧应该是这样的

    x   y   (x,y)
0   9   4   (9, 4)
1   8   6   (8, 6)
2   8   4   (8, 4)
3   1   7   (1, 7)
4   7   1   (7, 1)
5   0   5   (0, 5)

列(x,y)只是列x和y压缩在一起。我觉得这会很容易,因为函数需要元组输入。你知道吗

编辑:我很抱歉没有明确说明。我用欧几里德距离作为例子来简化我的要求。实际需求是应该使用函数来获得结果。函数所做的一切其实并不重要。你知道吗


Tags: 数据函数代码距离示例dffornp
2条回答

使用来自scipy.spacial.distance模块的^{}^{}

示例

from scipy.spatial.distance import pdist, squareform

euc_dist = pdist(df[['x', 'y']])
df_dist = pd.DataFrame(squareform(euc_dist), index=df['(x,y)'], columns=df['(x,y)'])

print(df_dist)

(x,y)     (9, 4)    (8, 6)    (8, 4)    (1, 7)    (7, 1)    (0, 5)
(x,y)                                                             
(9, 4)  0.000000  2.236068  1.000000  8.544004  3.605551  9.055385
(8, 6)  2.236068  0.000000  2.000000  7.071068  5.099020  8.062258
(8, 4)  1.000000  2.000000  0.000000  7.615773  3.162278  8.062258
(1, 7)  8.544004  7.071068  7.615773  0.000000  8.485281  2.236068
(7, 1)  3.605551  5.099020  3.162278  8.485281  0.000000  8.062258
(0, 5)  9.055385  8.062258  8.062258  2.236068  8.062258  0.000000

如果您坚持使用.apply,那么您需要像这样构造它:

def mult(xy1, xy2):
    return Eucledeandist(xy1, xy2)

import itertools

df_coords = pd.DataFrame([[x, y] for x, y in itertools.combinations_with_replacement(df['(x,y)'], 2)], columns=['xy1', 'xy2'])
df_coords.apply(lambda row: mult(row['xy1'], row['xy2']) , axis=1)

虽然,正如已经指出的,这是非常低效的,不建议。你知道吗

IIUC,不需要for循环或apply,它们非常慢。你知道吗

可以使用基于欧几里德距离公式的矢量化解决方案

np.sqrt(((df.values - df.values[:,None])**2).sum(2))

MCVE公司

df = pd.DataFrame({'x': [1,2,3,4], 'y':[10,20,30,40]})

    x   y
0   1   10
1   2   20
2   3   30
3   4   40

收益率

array([[ 0.        , 10.04987562, 20.09975124, 30.14962686],
       [10.04987562,  0.        , 10.04987562, 20.09975124],
       [20.09975124, 10.04987562,  0.        , 10.04987562],
       [30.14962686, 20.09975124, 10.04987562,  0.        ]])

相关问题 更多 >