Измените временной ряд Dataframe таким образом, чтобы он содержал только самые последние значения на основе таблицы журнала изменений. - PullRequest
0 голосов
/ 08 марта 2019

Привет всем и спасибо за вашу помощь. Я пытаюсь заменить старые значения во временном ряду на основе таблицы журнала, в которой записаны все изменения для каждого конкретного столбца, значения могли меняться несколько раз. В одном есть три столбца, значения которых меняются со временем.

enter image description here

Во второй таблице записаны изменения в столбцах первой таблицы, она содержит старые значения, новые значения в отдельных столбцах, а также даты, когда эти значения были изменены. enter image description here

То, что я пытаюсь сделать, выглядело бы так, enter image description here

1 Ответ

0 голосов
/ 08 марта 2019

Решение с одной строкой:

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
...