code: def add_edge_lengths(G):
      
  
      start_time = time.time()
  
      # first load all the edges' origin and destination coordinates as a
      # dataframe indexed by u, v, key
      coords = np.array([[u, v, k, G.nodes[u]['y'], G.nodes[u]['x'], G.nodes[v]['y'], G.nodes[v]['x']] for u, v, k in G.edges(keys=True)])
      df_coords = pd.DataFrame(coords, columns=['u', 'v', 'k', 'u_y', 'u_x', 'v_y', 'v_x'])
      df_coords[['u', 'v', 'k']] = df_coords[['u', 'v', 'k']].astype(np.int64)
      df_coords = df_coords.set_index(['u', 'v', 'k'])
  
      # then calculate the great circle distance with the vectorized function
      gc_distances = great_circle_vec(lat1=df_coords['u_y'],
                                      lng1=df_coords['u_x'],
                                      lat2=df_coords['v_y'],
                                      lng2=df_coords['v_x'])
  
      # fill nulls with zeros and round to the millimeter
      gc_distances = gc_distances.fillna(value=0).round(3)
      nx.set_edge_attributes(G, name='length', values=gc_distances.to_dict())
  
      log('Added edge lengths to graph in {:,.2f} seconds'.format(time.time()-start_time))
      return G
docs: Add length (meters) attribute to each edge by great circle distance between
      nodes u and v.
  
      Parameters
      ----------
      G : networkx multidigraph
  
      Returns
      -------
      G : networkx multidigraph