Use pd.IntervalIndex
In [2503]: s = pd.IntervalIndex.from_arrays(dfb.lowerbound_ip_address, dfb.upperbound_ip_address, 'both') In [2504]: dfa.assign(country=dfb.set_index(s).loc[dfa.ip_address].country.values) Out[2504]: ip_address country 0 13 China 1 5 Australia 2 20 China 3 11 China
More details
In [2505]: s Out[2505]: IntervalIndex([[0, 10], [11, 20]] closed='both', dtype='interval[int64]') In [2507]: dfb.set_index(s) Out[2507]: lowerbound_ip_address upperbound_ip_address country [0, 10] 0 10 Australia [11, 20] 11 20 China In [2506]: dfb.set_index(s).loc[dfa.ip_address] Out[2506]: lowerbound_ip_address upperbound_ip_address country [11, 20] 11 20 China [0, 10] 0 10 Australia [11, 20] 11 20 China [11, 20] 11 20 China
Customization
In [2508]: dfa Out[2508]: ip_address 0 13 1 5 2 20 3 11 In [2509]: dfb Out[2509]: lowerbound_ip_address upperbound_ip_address country 0 0 10 Australia 1 11 20 China
Zero source share