Python - 相互比较数据帧行

问题描述 投票:0回答:1

我有一个包含三列的数据框:id、纬度和经度。 对于每一行,我需要找到距离小于某些固定值的行。

我使用的解决方案是双for循环,我正在寻找更有效的实现。

这是我当前的代码:

import pandas as pd
def distance(coord1,coord2):
   ...
   return float_distance_in_km
df=pd.read_csv("coordinates.csv",na_values=None)

lessThan1=list()
lessThan5=list()
lessThan10=list()
lessThan50=list()
for i in range(0,len(df)):
   lessThan1_row=list()
   lessThan5_row=list()
   lessThan10_row=list()
   lessThan50_row=list()
   if  df['longitude'][i] is not None and df['latitude'][i] is not None:
       coords_1=(df['longitude'][i],df['latitude'][i])
       for j in range(0,len(df)):
           if i==j:
               continue
           if df['longitude'][j] is None or  df['latitude'][j] is None:
               continue
           coords_2=(df['longitude'][j],df['latitude'][j])
           dist=distance(coords_1, coords_2)
           neighbor=df['id'][j]
           if dist<1:
               lessThan1_row.append(neighbor)
           elif dist<5:
               lessThan1_row.append(neighbor)
           elif dist<10:
               lessThan1_row.append(neighbor)
           elif dist<50:
               lessThan1_row.append(neighbor)
   lessThan1.append(lessThan1_row)
   lessThan5.append(lessThan5_row)
   lessThan10.append(lessThan10_row)
   lessThan50.append(lessThan50_row)
df["1km"]=lessThan1
df["5km"]=lessThan5
df["10km"]=lessThan10
df["50km"]=lessThan50

数据帧输出不是强制性的,我只是碰巧将数据集加载为数据帧。

python pandas dataframe list nested-loops
1个回答
0
投票

一种方法是使用

geopandas
,如下所示:

import geopandas as gpd
import pandas as pd
import numpy as np

data = pd.DataFrame(np.random.randn(200,2)*2+[[50, 6]], columns=['latitude', 'longitude'])
data = gpd.GeoDataFrame(
    data[[]], geometry=gpd.points_from_xy(data.longitude, data.latitude), crs="EPSG:4326")

distances = data['geometry'].apply(lambda x: data.distance(x)).melt(ignore_index=False).reset_index().rename({'index': 'from', 'variable': 'to', 'value': 'distance'}, axis=1)
distances[distances['distance'] < 1]

它保存距离小于1米的

from
to
列中的索引值。不过,geopandas 文档中没有米单位。

© www.soinside.com 2019 - 2024. All rights reserved.