Pandas 对每对行应用操作

Tay*_*hra 0 python pandas

在计算 langitude 和 longitude 之间的距离时,数据帧列中重复相同的值。我创建了一个动态列来查找每个源到目的地之间的距离,但每列的所有值都是重复的。

for a,b,x in zip(df.Longitude,df.Latitude,df.index):
    for c,d in zip(df.Longitude,df.Latitude):
        df['distance_'+str(x)]=haversine(a,b,c,d)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

假设这是数据框

  index   name   lat     long

    0      a     74.299104  31.481188

    1      b     74.351619  39.481188

    2      c     73.351619  39.481188
Run Code Online (Sandbox Code Playgroud)

现在我想要这样的预期结果

  index   name   lat          long     distanceA      distanceB     distanceC

    0      a     74.299104  31.481188      0             4.5          2.4

    1      b     74.351619  39.481188     5.7             0           5.8

    2      c     73.351619  39.481188     3.8            1.3           0
Run Code Online (Sandbox Code Playgroud)

cs9*_*s95 5

由于结果沿对角线镜像,因此您可以将迭代次数减半:

res = pd.DataFrame(index=df['name'], columns=df['name'])

for idx1 in df.index:
    for idx2 in df.index[idx1+1:]:
         name1, lat1, lon1 = df.loc[idx1, ['name', 'lat', 'long']]
         name2, lat2, lon2 = df.loc[idx2, ['name', 'lat', 'long']]

         res.loc[name1, name2] = haversine(lat1, lon1, lat2, lon2)

res = res.add(res.T, fill_value=0)  # res is upper triangular
Run Code Online (Sandbox Code Playgroud)