Прямой подход будет выглядеть так:
df1.merge(df2, how='left')
Но это может быть быстрее при создании карты (словаря).Может быть, вы можете попробовать оба с вашим набором данных.
m = df2.set_index(['Hour','Longitude','Latitude'])['Meteo']
df1['meteo'] = [m.get(tuple(i), '') for i in df1.values]
Настройка
import pandas as pd
data1 = '''\
Hour Longitude Latitude
21:30 54.05 23
22:30 54.05 23
23:30 54.05 23'''
data2 = '''\
Hour Longitude Latitude Meteo
21:30 54.05 23 20degrees
22:30 106.05 67 -5degrees
23:30 14.05 102 12degrees'''
df1 = pd.read_csv(pd.compat.StringIO(data1), sep='\s+')
df2 = pd.read_csv(pd.compat.StringIO(data2), sep='\s+')
TIMEIT
%timeit df1.merge(df2, how='left').fillna('')
%timeit m = df2.set_index(['Hour','Longitude','Latitude'])['Meteo']; df1['meteo'] = [m.get(i,'') for i in zip(df1['Hour'],df1['Longitude'],df1['Latitude'])]
%timeit m = df2.set_index(['Hour','Longitude','Latitude'])['Meteo']; df1['meteo'] = [m.get(tuple(i), '') for i in df1.values]
Возвращает
100 loops, best of 3: 3.69 ms per loop
100 loops, best of 3: 3.03 ms per loop
100 loops, best of 3: 2.99 ms per loop