python - Pandas 在多列上滞后并设置迭代次数
问题描述
我有一个如下的数据框:
df = pd.DataFrame({'col1': [1, 2], 'col2': [3, 4]})
我想应用 pandas shift 函数将每一列移动 4 次,并为每个班次创建一个新行:
col1 col1.lag0 col1.lag1 col1.lag2 col1.lag3 col2 col2.lag0 col2.lag1 col2.lag2 col2.lag3
1 0 0 0 0 3 0 0 0 0
2 1 0 0 0 4 3 0 0 0
0 2 1 0 0 0 4 3 0 0
0 0 2 1 0 0 0 4 3 0
0 0 0 2 1 0 0 0 4 3
我已经尝试了一些类似 shift 的解决方案d['col1'].shift().fillna(0)
,但是,我不确定如何迭代解决方案,也不知道如何确保将正确数量的行添加到数据框中。
解决方案
首先,我将给定的 DataFrame 扩展了正确的零行数。然后迭代列和移位量以创建所需的列。
import pandas as pd
df = pd.DataFrame({'col1': [1, 2], 'col2': [3, 4]})
n_shifts = 4
zero_rows = pd.DataFrame(index=pd.RangeIndex(n_shift_rows), columns=df.columns).fillna(0)
df = df.append(zero_rows).reset_index(drop=True)
for col in df.columns:
for shift_amount in range(1, n_shifts+1):
df[f"{col}.lag{shift_amount}"] = df[col].shift(shift_amount)
df.fillna(0).astype(int)
正如 Ben.T 所指出的,可以避免外部循环,因为shift
可以立即将其应用于整个 DataFrame。循环的另一种选择是
shifts = df
for shift_amount in range(1, n_shifts+1):
columns = df.columns + ".lag" + str(shift_amount)
shift = pd.DataFrame(df.shift(shift_amount).values, columns=columns)
shifts = shifts.join(shift)
shifts.fillna(0).astype(int)
推荐阅读
- typescript - 如何强制我的自定义 tslint 规则使用与 tslint 使用的 typescript 模块相同的版本
- silverstripe - 无法在 SilverStripe 4.4.4 中自定义 ModelAdmin 的过滤器/搜索表单
- javascript - 完成后在哪里调用cancelAnimationFrame?
- mysql - 如何从我的 django 网站连接到集中式 MySQL 数据库?
- sql - 按照固定模式将表格值转换为文本
- python - 有没有办法让字典键指向原始变量?
- typescript - 打字稿推断是否有可能直接推断值并删除密钥
- java - 如何在 JPA/JAVA/Hibernate 的两列中插入自动生成的 ID
- ag-grid - 在单元格中显示多行文本,可以在 Ag Grid 中展开折叠?
- docker - docker push 失败:清单无效