In [3]: df1 = pd.DataFrame({"start": [1,2,6], "end": [2,6,9]}) ...: df2 = pd.DataFrame({"foo": [1,2,3,4,5,6,7,8,9]}) ...: dfm = pd.merge(df1, df2, how="cross") ...: dfm.loc[(dfm.foo >= dfm.start) & (dfm.foo < dfm.end)] Out[3]: start end foo 0 1 2 1 10 2 6 2 11 2 6 3 12 2 6 4 13 2 6 5 23 6 9 6 24 6 9 7 25 6 9 8