需要帮助优化此代码以获得更快的结果

时间:2019-07-12 17:09:39

标签: python pandas algorithm

要提供数据概述,数据的多行具有相同的ID,此外,多列具有相同的值。现在,有些函数将为具有相同id的行输出相同的结果。因此,我将这个id分组,执行我需要在其上执行的功能,然后开始循环遍历每个组中的每一行,以执行将为每一行产生不同结果的功能,即使使用相同的ID。

以下是一些示例数据:


id  map_sw_lon  map_sw_lat  map_ne_lon  map_ne_lat exact_lon exact_lat
1     10        15           11            16          20       30
1     10        15           11            16          34       50
2     20        16           21            17          44       33
2     20        16           21            17          50       60

这是我的代码:

for id, group in df.groupby("id", sort=False):

   viewport = box(group["map_sw_lon"].iloc[0], 
   group["map_sw_lat"].iloc[0], group["map_ne_lon"].iloc[0], 
   group["map_ne_lat"].iloc[0])
   center_of_viewport = viewport.centroid
   center_hex = h3.geo_to_h3(center_of_viewport.y, center_of_viewport.x, 8)    

# everything above here can be done only once per group.   

# everything below needs to be done per row per group.
   for index, row in group.iterrows():

      current_hex = h3.geo_to_h3(row["exact_lat"], row["exact_lon"], 8)
      df.at[index,'hex_id'] = current_hex
      df.at[index, 'hit_count'] = 1

      df.at[index, 'center_hex'] = center_hex 
      distance_to_center = h3.h3_distance(current_hex, center_hex)
      df.at[index,'hex_dist_to_center'] = distance_to_center

此代码可在5分钟内处理100万行数据。问题是我要处理的数据要大得多,并且需要更快的工作速度。我知道不建议在Pandas中使用循环,但是我不确定如果不使用循环如何解决此问题。任何帮助,将不胜感激。

1 个答案:

答案 0 :(得分:0)

您需要进行一些性能分析,以查看代码各部分运行所需的时间。我猜想最耗时的部分是geo_to_h3h3_distance调用。如果是这样,则对数据帧操作的其他可能改进(例如,使用DataFrame.applyGroupBy.transform)将无济于事。