【问题标题】:Change a Dataframe timeseries such that it only contains the most updated value based on a changes log table更改 Dataframe 时间序列,使其仅包含基于更改日志表的最新值
【发布时间】:2019-03-07 22:54:17
【问题描述】:

大家好,感谢大家的帮助。 我正在尝试根据记录每个特定列的所有更改的日志表替换时间序列上的旧值,值可能已更改多次。 一个具有三列,其值随时间变化。

第二个表记录了对第一个表的列的更改,它包含旧值,新值位于单独的列上,它还包含更改这些值的日期。

我想要完成的事情看起来像这样,

【问题讨论】:

    标签: python sql pandas dataframe series


    【解决方案1】:

    一行解决方案是这样的:

    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
    

    【讨论】:

    • 丹尼斯,非常感谢您的回复。但是,我要完成的工作与您的解决方案的目的相反。我有一张表,其中的值随时间不断变化,需要用最新的值替换那些旧值。
    • 请在某处托管 cab 文件或创建漏勺共享笔记本
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 2012-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-03
    • 2019-08-20
    相关资源
    最近更新 更多