Python3, Pandas: обновление DataFrame в обоих направлениях с приоритетом - PullRequest
0 голосов
/ 21 апреля 2020

Приносим свои извинения, если это вопрос RTFM, но многочисленные документы и вопросы, кажется, решают несколько иные проблемы, чем эта: Как я могу наиболее элегантно обновить существующий DataFrame новым, частично перекрывающимся? Это; объединение обоих измерений с указанным приоритетом.

>>> old_df   #  Original data frame which I would like to update
            Stat1  Stat2
Time
2020-04-17  117.2  217.2
2020-04-18  118.2  218.2
2020-04-19  119.2  219.2

>>> new_df   #  More recent data frame, partly overlapping the original in both dimensions
            Stat1  Stat3
Time
2020-04-18  118.1  318.1
2020-04-19  119.1  319.1
2020-04-20  120.1  320.1
2020-04-21  121.1  321.1

>>> upd_df   #  Desired result; new where possible, old otherwise
            Stat1  Stat2  Stat3
Time
2020-04-17  117.2  217.2    NaN
2020-04-18  118.1  218.2  318.1
2020-04-19  119.1  219.2  319.1
2020-04-20  120.1    NaN  320.1
2020-04-21  121.1    NaN  321.1

Во время кодирования; формы, имена столбцов и периоды времени двух DF неизвестны.

Код для создания двух DF и требуемый результат:

>>> import numpy as np 
>>> import pandas as pd

>>> old_ttags =  [pd.Timestamp('2020-04-17'), pd.Timestamp('2020-04-18'), pd.Timestamp('2020-04-19')]
>>> old_data = {'Time': old_ttags, 'Stat1': [117.2, 118.2, 119.2], 'Stat2': [217.2, 218.2, 219.2]}
>>> old_df = pd.DataFrame(old_data).set_index('Time')

>>> new_ttags =  [pd.Timestamp('2020-04-18'), pd.Timestamp('2020-04-19'), pd.Timestamp('2020-04-20'), pd.Timestamp('2020-04-21')]
>>> new_data = {'Time': new_ttags, 'Stat1': [118.1, 119.1, 120.1, 121.1], 'Stat3': [318.1, 319.1, 320.1, 321.1]}
>>> new_df = pd.DataFrame(new_data).set_index('Time')

>>> upd_ttags = [pd.Timestamp('2020-04-17'), pd.Timestamp('2020-04-18'), pd.Timestamp('2020-04-19'), pd.Timestamp('2020-04-20'), pd.Timestamp('2020-04-21')]
>>> upd_data = {'Time': upd_ttags, 'Stat1': [117.2, 118.1, 119.1, 120.1, 121.1], 'Stat2': [217.2, 218.2, 219.2, np.nan, np.nan], 'Stat3': [np.nan, 318.1, 319.1, 320.1, 321.1]}
>>> upd_df = pd.DataFrame(upd_data).set_index('Time')

1 Ответ

0 голосов
/ 21 апреля 2020

Вы ищете combine_first:

new_df.combine_first(old_df)

Вывод:

            Stat1  Stat2  Stat3
Time                           
2020-04-17  117.2  217.2    NaN
2020-04-18  118.1  218.2  318.1
2020-04-19  119.1  219.2  319.1
2020-04-20  120.1    NaN  320.1
2020-04-21  121.1    NaN  321.1
...