Решение с одной строкой:
df['new_value'] = df.merge(changes, how = 'left')['new_value'].\
fillna(method = 'ffill').fillna(df.old_value)
Подробно:
Сначала создайте образец DataFrame с начальными значениями:
df = pd.DataFrame({'dates':['2017-01-01', \
'2017-01-02', '2017-01-03', '2017-01-04', '2017-01-05'],\
'old_value': ['AAA','AAA','AAA','AAA','AAA']})
dates old_value
0 2017-01-01 AAA
1 2017-01-02 AAA
2 2017-01-03 AAA
3 2017-01-04 AAA
4 2017-01-05 AAA
ИDataFrame с изменениями:
changes = pd.DataFrame({'dates':['2017-01-02','2017-01-04' ],\
'new_value':['BBB', 'CCC']})
dates new_value
0 2017-01-02 BBB
1 2017-01-04 CCC
Теперь присоедините изменения к исходному DataFrame:
df = df.merge(changes, how = 'left')
dates old_value new_value
0 2017-01-01 AAA NaN
1 2017-01-02 AAA BBB
2 2017-01-03 AAA NaN
3 2017-01-04 AAA CCC
4 2017-01-05 AAA NaN
Затем заполните NA сверху вниз, используя прямое заполнение NA:
df['new_value'] = df['new_value'].fillna(method = 'ffill')
dates old_value new_value
0 2017-01-01 AAA NaN
1 2017-01-02 AAA BBB
2 2017-01-03 AAA BBB
3 2017-01-04 AAA CCC
4 2017-01-05 AAA CCC
Наконец, исправьте начало временной шкалы с исходными значениями:
df['new_value'] = df['new_value'].fillna(df.old_value)
Результат:
dates old_value new_value
0 2017-01-01 AAA AAA
1 2017-01-02 AAA BBB
2 2017-01-03 AAA BBB
3 2017-01-04 AAA CCC
4 2017-01-05 AAA CCC