python - 将时间序列的先前条目写入附加列
问题描述
我有一个包含个别日期值的数据框:
day value
1 10.1
2 15.4
3 12.1
4 14.1
5 -9.7
6 2.0
8 3.4
每天不需要一个值(在我的示例中缺少第 7 天),但每天的值永远不会超过一个。
我想向这个数据框添加额外的列,每行包含前一天的值、两天前的值、三天前的值等。结果将是:
day value value-of-1 value-of-2 value-of-3
1 10.1 NaN NaN NaN
2 15.4 10.1 NaN NaN
3 12.1 15.4 10.1 NaN
4 14.1 12.1 15.4 10.1
5 -9.7 14.1 12.1 15.4
6 2.0 -9.7 14.1 12.1
8 3.4 NaN 2.0 -9.7
目前,我将包含所需日期的列添加到原始数据框中,然后使用此新列作为连接条件合并原始数据框。在对列进行一些重组后,我得到了我的结果:
data = [[1, 10.1], [2, 15.4], [3, 12.1], [4, 14.1], [5, -9.7], [6, 2.0], [8, 3.4]]
df = pd.DataFrame(data, columns = ['day', 'value'])
def add_column_for_prev_day(df, day):
df[f"day-{day}"] = df["day"] - day
df = df.merge(df[["day", "value"]], how="left", left_on=f"day-{day}", right_on="day", suffixes=("", "_r")) \
.drop(["day_r",f"day-{day}"],axis=1) \
.rename({"value_r": f"value-of-{day}"}, axis=1)
return df
df = add_column_for_prev_day(df, 1)
df = add_column_for_prev_day(df, 2)
df = add_column_for_prev_day(df, 3)
我想知道是否有更好更快的方法来获得相同的结果,尤其是不必一遍又一遍地合并数据框。
一个简单的转变无济于事,因为有几天没有数据。
解决方案
您可以使用:
m=df.set_index('day').reindex(range(df['day'].min(),df['day'].max()+1))
l=[1,2,3]
for i in l:
m[f"value_of_{i}"] = m['value'].shift(i)
m.reindex(df.day).reset_index()
day value value_of_1 value_of_2 value_of_3
0 1 10.1 NaN NaN NaN
1 2 15.4 10.1 NaN NaN
2 3 12.1 15.4 10.1 NaN
3 4 14.1 12.1 15.4 10.1
4 5 -9.7 14.1 12.1 15.4
5 6 2.0 -9.7 14.1 12.1
6 8 3.4 NaN 2.0 -9.7
推荐阅读
- ios - 在 ios 中以编程方式创建具有颜色渐变和模糊效果的 UIView
- node.js - 如何在 node.js 中按顺序运行 GET 或 POST 方法
- sql - 循环遍历记录组
- c# - 为什么 .NET 在错误的 IF 语句上执行代码?
- fluent - 删除模块后 silverstripe 4 服务器错误
- javascript - 显示按钮激活
- drupal - 在 Drupal 8 管理员中添加一个弹出窗口
- javascript - 对 JSON 数据进行排序并获得前 n 条记录
- php - 将其用于 cron 作业的安全 Laravel URL
- pymodbus3 - pyModBus : 检查线圈是真还是假