Vectorizing a function in pandas

前端 未结 3 837
日久生厌
日久生厌 2020-12-08 23:33

I have a dataframe that contains a list of lat/lon coordinates:

d = {\'Provider ID\': {0: \'10001\',
  1: \'10005\',
  2: \'10006\',
  3: \'10007\',
  4: \'1         


        
3条回答
  •  [愿得一人]
    2020-12-09 00:25

    To vectorize this code, you will need to operate on complete dataframe and not on the individual lats and longs. I have made an attempt at this. I need the result df and a new function h2,

    import numpy as np
    def h2(df, p):
        inrad = df.applymap(radians)
        dlon = inrad.longitude-inrad.longitude[p]
        dlat = inrad.latitude-inrad.latitude[p]
        lat1 = pd.Series(index = df.index, data = [df.latitude[p] for i in range(len(df.index))])
        a = np.sin(dlat/2)*np.sin(dlat/2) + np.cos(df.latitude) * np.cos(lat1) * np.sin(dlon/2)**2
        c = 2 * 1/np.sin(np.sqrt(a))
        km = 6367 * c
        return km
    
    df = df.set_index('Provider ID')
    df = df.astype(float)
    df2 = pd.DataFrame(index = df.index, columns = df.index)
    for c in df2.columns:
        df2[c] = h2(df, c)
    
    print (df2)
    

    This should yield, (I can't be sure if I have the correct answer... my goal was to vectorize the code)

    Provider ID         10001         10005         10006         10007  \
    Provider ID                                                           
    10001                 inf  5.021936e+05  5.270062e+05  1.649088e+06   
    10005        5.021936e+05           inf  9.294868e+05  4.985233e+05   
    10006        5.270062e+05  9.294868e+05           inf  4.548412e+05   
    10007        1.649088e+06  4.985233e+05  4.548412e+05           inf   
    10008        1.460299e+06  5.777248e+05  5.246954e+05  3.638231e+06   
    10011        6.723581e+05  2.004199e+06  1.027439e+06  6.394402e+05   
    10012        4.559090e+05  3.265536e+06  7.573411e+05  4.694125e+05   
    10016        7.680036e+05  1.429573e+06  9.105474e+05  7.517467e+05   
    10018        7.096548e+05  1.733554e+06  1.020976e+06  6.701920e+05   
    10019        5.436342e+05  9.278739e+05  2.891822e+07  4.638858e+05   
    
    Provider ID         10008         10011         10012         10016  \
    Provider ID                                                           
    10001        1.460299e+06  6.723581e+05  4.559090e+05  7.680036e+05   
    10005        5.777248e+05  2.004199e+06  3.265536e+06  1.429573e+06   
    10006        5.246954e+05  1.027439e+06  7.573411e+05  9.105474e+05   
    10007        3.638231e+06  6.394402e+05  4.694125e+05  7.517467e+05   
    10008                 inf  7.766998e+05  5.401081e+05  9.496953e+05   
    10011        7.766998e+05           inf  1.341775e+06  4.220911e+06   
    10012        5.401081e+05  1.341775e+06           inf  1.119063e+06   
    10016        9.496953e+05  4.220911e+06  1.119063e+06           inf   
    10018        8.236437e+05  1.242451e+07  1.226941e+06  5.866259e+06   
    10019        5.372119e+05  1.051748e+06  7.514774e+05  9.362341e+05   
    
    Provider ID         10018         10019  
    Provider ID                              
    10001        7.096548e+05  5.436342e+05  
    10005        1.733554e+06  9.278739e+05  
    10006        1.020976e+06  2.891822e+07  
    10007        6.701920e+05  4.638858e+05  
    10008        8.236437e+05  5.372119e+05  
    10011        1.242451e+07  1.051748e+06  
    10012        1.226941e+06  7.514774e+05  
    10016        5.866259e+06  9.362341e+05  
    10018                 inf  1.048895e+06  
    10019        1.048895e+06           inf  
    
    [10 rows x 10 columns]
    

提交回复
热议问题