【发布时间】:2019-03-07 22:54:17
【问题描述】:
大家好,感谢大家的帮助。 我正在尝试根据记录每个特定列的所有更改的日志表替换时间序列上的旧值,值可能已更改多次。 一个具有三列,其值随时间变化。
【问题讨论】:
标签: python sql pandas dataframe series
大家好,感谢大家的帮助。 我正在尝试根据记录每个特定列的所有更改的日志表替换时间序列上的旧值,值可能已更改多次。 一个具有三列,其值随时间变化。
【问题讨论】:
标签: python sql pandas dataframe series
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
【讨论】: