Один из способов, если ваши фреймы данных невелики, - это использовать декартово произведение и фильтровать фреймы данных.
mapper = df_A.assign(key=1).merge(df_B.assign(key=1))\
.query('start_date <= event_date <= end_date')\
.groupby('start_date')['price'].mean()
df_A['avg.price'] = df_A['start_date'].map(mapper)
print(df_A)
Вывод:
start_date end_date avg.price
0 2017-03-01 2017-04-20 100.000000
1 2017-03-20 2017-04-27 NaN
2 2017-04-10 2017-05-25 133.333333
3 2017-04-17 2017-05-22 125.000000
В противном случае см. этот пост