为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

守候你守候我 2023-12-20 16:03:08
我正在尝试使用 apply 函数向数据框添加新列。我需要计算第 0 行和所有其他行中 X 和 Y 坐标之间的距离,我创建了以下逻辑:import pandas as pdimport numpy as npdata = {'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 distancedef 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 hererecModif(df)但这总是返回错误:ValueError: Wrong number of items passed 9, placement implies我认为由于 x 和 y 是标量,使用np.repeat可能有帮助,但没有帮助,错误仍然是相同的。我看到类似的帖子,例如this,但是乘法很简单,我怎样才能实现我需要的减法呢?
查看完整描述

3 回答

?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

中的变量名称.apply()混乱并与外部作用域发生冲突。避免这种情况,代码就可以工作了。


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


df

   X  Y  Value       dist

0  0  0      6   0.000000

1  0  1      7   1.000000

2  0  4      4   4.000000

3  1  2      5   2.236068

4  1  6      6   6.082763

5  5  5      5   7.071068

6  6  6      6   8.485281

7  7  4      4   8.062258

8  8  8      8  11.313708

另请注意, np.power() 和 np.sqrt() 已经矢量化,因此 .apply 本身对于给定的数据集是多余的:


countDistance(x,y,df['X'],df['Y'])


Out[154]: 

0     0.000000

1     1.000000

2     4.000000

3     2.236068

4     6.082763

5     7.071068

6     8.485281

7     8.062258

8    11.313708

dtype: float64


查看完整回答
反对 回复 2023-12-20
?
眼眸繁星

TA贡献1873条经验 获得超9个赞

为了实现您的最终目标,我建议将函数 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   dist

0   0   0   6   0.000000

1   0   1   7   1.000000

2   0   4   4   4.000000

3   1   2   5   2.236068

4   1   6   6   6.082763

5   5   5   5   7.071068

6   6   6   6   8.485281

7   7   4   4   8.062258

8   8   8   8   11.313708


查看完整回答
反对 回复 2023-12-20
?
德玛西亚99

TA贡献1770条经验 获得超3个赞

解决方案

尝试这个:


## Method-1

df['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 pd

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)


查看完整回答
反对 回复 2023-12-20
  • 3 回答
  • 0 关注
  • 128 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信