pandas 如何加快计算速度,以获得panda中2个 Dataframe 的逐行计算的最小值

7ivaypg9  于 2022-12-02  发布在  其他
关注(0)|答案(1)|浏览(127)

我有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 中的单列),想知道是否有一个好的方法来矢量化它,或者用另一种方法来加速它。谢谢!

tkclm6bt

tkclm6bt1#

据我所知,geodesic函数不支持矢量化,因此需要您自己实现坐标矢量的距离计算函数,幸运的是,这样的实现有很多,Here是一个非常简单的实现,下面是一个完整的例子,可以解决您的问题,我已经用您提供的维度创建了两个 Dataframe 。
第一个
您还可以使用parallel-pandas库并行化apply方法,这非常简单,不需要重写代码。
第一次
因此,总时间只需要一秒多一点。我希望这是你可以接受的。祝你好运!

相关问题