在数据帧上应用函数计算 int 和 series 之间的差异幂

我正在尝试使用 apply 函数向数据框添加新列。我需要计算第 0 行和所有其他行中 X 和 Y 坐标之间的距离,我创建了以下逻辑:


import pandas as pd

import numpy as np

data = {'X':[0,0,0,1,1,5,6,7,8],'Y':[0,1,4,2,6,5,6,4,8],'Value':[6,7,4,5,6,5,6,4,8]}

df = pd.DataFrame(data)


def countDistance(lat1, lon1, lat2, lon2):

        print(lat1, lon1, lat2, lon2)

        #use basic knowledge about triangles - values are in meters

        distance = np.sqrt(np.power(lat1-lat2,2)+np.power(lon1-lon2,2))

        return distance


def recModif(df):

        x = df.loc[0,'X']

        y = df.loc[0,'Y']

        df['dist'] = df.apply(lambda n: countDistance(x,y,df['X'],df['Y']), axis=1)

        #more code will come here


recModif(df)

但这总是返回错误:ValueError: Wrong number of items passed 9, placement implies


我认为由于 x 和 y 是标量,使用np.repeat可能有帮助,但没有帮助,错误仍然是相同的。我看到类似的帖子,例如this,但是乘法很简单,我怎样才能实现我需要的减法呢?


守候你守候我
浏览 129回答 3
3回答

慕无忌1623718

中的变量名称.apply()混乱并与外部作用域发生冲突。避免这种情况,代码就可以工作了。df['dist'] = df.apply(lambda row: countDistance(x,y,row['X'],row['Y']), axis=1)df   X  Y  Value       dist0  0  0      6   0.0000001  0  1      7   1.0000002  0  4      4   4.0000003  1  2      5   2.2360684  1  6      6   6.0827635  5  5      5   7.0710686  6  6      6   8.4852817  7  4      4   8.0622588  8  8      8  11.313708另请注意, np.power() 和 np.sqrt() 已经矢量化,因此 .apply 本身对于给定的数据集是多余的:countDistance(x,y,df['X'],df['Y'])Out[154]: 0     0.0000001     1.0000002     4.0000003     2.2360684     6.0827635     7.0710686     8.4852817     8.0622588    11.313708dtype: float64

眼眸繁星

为了实现您的最终目标,我建议将函数 recModif 更改为:def recModif(df):    x = df.loc[0,'X']    y = df.loc[0,'Y']    df['dist'] = countDistance(x,y,df['X'],df['Y'])    #more code will come here这输出X   Y   Value   dist0   0   0   6   0.0000001   0   1   7   1.0000002   0   4   4   4.0000003   1   2   5   2.2360684   1   6   6   6.0827635   5   5   5   7.0710686   6   6   6   8.4852817   7   4   4   8.0622588   8   8   8   11.313708

德玛西亚99

解决方案尝试这个:## Method-1df['dist'] = ((df.X - df.X[0])**2 + (df.Y - df.Y[0])**2)**0.5## Method-2: .apply()x, y = df.X[0], df.Y[0]df['dist'] = df.apply(lambda row: ((row.X - x)**2 + (row.Y - y)**2)**0.5, axis=1)输出:# print(df.to_markdown(index=False))|   X |   Y |   Value |     dist ||----:|----:|--------:|---------:||   0 |   0 |       6 |  0       ||   0 |   1 |       7 |  1       ||   0 |   4 |       4 |  4       ||   1 |   2 |       5 |  2.23607 ||   1 |   6 |       6 |  6.08276 ||   5 |   5 |       5 |  7.07107 ||   6 |   6 |       6 |  8.48528 ||   7 |   4 |       4 |  8.06226 ||   8 |   8 |       8 | 11.3137  |虚拟数据import pandas as pddata = {    'X': [0,0,0,1,1,5,6,7,8],    'Y': [0,1,4,2,6,5,6,4,8],    'Value':[6,7,4,5,6,5,6,4,8]}df = pd.DataFrame(data)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python