我有2个(用于简化演示) Dataframe :
| 表1_id|迟|长的|表2标识|
| - -|- -|- -|- -|
| 一个|5.5分|四十五点五||
| 2个|第5.2节|50.2分||
| 三个|八点九分|四十九点七||
| 表2标识|迟|长的|
| - -|- -|- -|
| 一个|5.0版本|四十七点二|
| 2个|八点五|二十二点五|
| 三个|二、一|三十三点三|
表1有40000行以上。表2有3000行。
我想要的是找到表1中的每个项目的table2_id,它使用纬度/经度与其位置具有最短的距离,对于距离计算,我使用geopy. distance。
要做到这一点,最慢的方法是迭代表1中的每个坐标,并对每个坐标迭代表2中的所有行,以找到最小值。使用DataFrame.iterrows()或DataFrame. apply,这是非常慢的。
看起来会有点像这样:
for idx, row in table1_df.iterrows():
location1 = (row["lat"], row["long"])
min_table2id = 0
min_distance = 9999999
for idx2, row2 in table2_df.iterrows():
location2 = (row2["lat"], row2["long"])
distance = geopy.distance.geodesic(location1, location2).km
if distance < min_distance:
min_distance = distance
min_table2id = row2[table2_id]
row[table2_id] = min_table2id
我只对较小的数据集做过简单的事情,速度从来不是问题,但这需要几分钟,这在某种程度上是对大型表的2个for循环所期望的。
我不太熟悉矢量化(只使用它来操作 Dataframe 中的单列),想知道是否有一个好的方法来矢量化它,或者用另一种方法来加速它。谢谢!
1条答案
按热度按时间tkclm6bt1#
据我所知,
geodesic
函数不支持矢量化,因此需要您自己实现坐标矢量的距离计算函数,幸运的是,这样的实现有很多,Here是一个非常简单的实现,下面是一个完整的例子,可以解决您的问题,我已经用您提供的维度创建了两个 Dataframe 。第一个
您还可以使用parallel-pandas库并行化apply方法,这非常简单,不需要重写代码。
第一次
因此,总时间只需要一秒多一点。我希望这是你可以接受的。祝你好运!