Определите следующую функцию:
def getLastDateRows(dat, df):
rows = df.query('Date == @dat')
n = rows.index.size
if n == 0:
lastDat = df.Date[df.Date < dat].iloc[-1]
rows = df.query('Date == @lastDat')
return pd.DataFrame({ 'Date': dat, 'Product': rows.Product })
Затем примените его к каждому dfDates.Date и concat результаты:
pd.concat(dfDates.Date.apply(getLastDateRows, df=dfProducts)\
.tolist(), ignore_index=True)
Результат такой же, как и ожидалось.
Приложение
Решение, предложенное Рэнди , может быть немного улучшено:
dfProducts.groupby('Date').Product.apply(list)\
.reindex(dfDates.Date).ffill().explode().reset_index()
Различия:
- Переиндексирование включено dfDates.Date (не весь диапазон), поэтому результат будет содержать только даты, присутствующие в dfDates , который может содержать преднамеренные "пробелы", например, для выходных.
- Последний вызов reset_index приводит к тому, что в результате получается DataFrame (неa Series ).