将两个数据框与一个函数进行比较(没有公共索引)

时间:2018-09-19 09:41:58

标签: python-3.x pandas

我有2个熊猫数据框,餐馆:

     Lat        Long             Name
0    43.599503  1.440678      Le Filochard
1    43.602369  1.447368      Le Wallace
2    43.603838  1.435186      Chez Tonton, Pastis Ô Maître

和酒店:

      Lat      Long             Name
0   43.603779  1.444004         Grand Hôtel de l'Opéra
1   43.599482  1.441207         Hôtel Garonne
2   43.549924  1.499821         Ibis Styles

和1个原点=(纬度,经度)坐标的函数距离(原点,目标)。

我正在尝试将该函数应用于2个数据帧,以计算第一个数据帧的每一行的距离,第二个数据帧的项数小于其...的距离...

我正在尝试套用地图功能,但无法通过2个数据帧执行它;我需要合并它们吗?

1 个答案:

答案 0 :(得分:1)

这对您有用吗? 只需校正距离功能

hotels=pd.DataFrame([[43.599503, 1.440678, 'Le Filochard'],
                     [43.602369, 1.447368, 'Le Wallace'],
                     [43.603838, 1.435186, 'Chez Tonton, Pastis Ô Maître']],
                   columns=['Lat', 'Long', 'Name'])
restaurants=pd.DataFrame([[43.603779, 1.444004, "Grand Hôtel de l'Opéra"],
                          [43.599482, 1.441207, 'Hôtel Garonne'],
                          [43.549924, 1.499821, 'Ibis Styles']],
                         columns=['Lat', 'Long', 'Name'])
hotels['Nearby Resaurants'] = hotels.apply(lambda h: list(restaurants[((restaurants.Lat-h.Lat)**2+(restaurants.Long-h.Long)**2)<0.005].Name), axis=1)
print(hotels)
            Lat      Long                          Name  \
0  43.599503  1.440678                  Le Filochard   
1  43.602369  1.447368                    Le Wallace   
2  43.603838  1.435186  Chez Tonton, Pastis Ô Maître   

                         Nearby Resaurants  
0  [Grand Hôtel de l'Opéra, Hôtel Garonne]  
1  [Grand Hôtel de l'Opéra, Hôtel Garonne]  
2  [Grand Hôtel de l'Opéra, Hôtel Garonne]

编辑:

修改功能以处理功能,也可以使用lambda函数过滤酒店

def distance(X,Y):
    return((X[0]-X[1])**2+(Y[0]-Y[1])**2)

hotels['Nearby Resaurants'] = hotels.apply(lambda h: list(restaurants.loc[restaurants.apply(lambda r: distance((r.Lat,h.Lat),(r.Long,h.Long))<0.005, axis=1)].Name), axis=1)
print(hotels)