您可以使用
over
import polars as pl
df = pl.DataFrame({
'object': [1, 1, 1, 2, 2],
'period': [1, 2, 4, 4, 23],
'value': [24, 67, 89, 5, 23],
})
df.with_column(
pl.col('value').shift().over('object').alias('prev_value')
)
shape: (5, 4)
ââââââââââ¬âââââââââ¬ââââââââ¬âââââââââââââ
â object â period â value â prev_value â
â --- â --- â --- â --- â
â i64 â i64 â i64 â i64 â
ââââââââââªâââââââââªââââââââªâââââââââââââ¡
â 1 â 1 â 24 â null â
ââââââââââ¼âââââââââ¼ââââââââ¼âââââââââââââ¤
â 1 â 2 â 67 â 24 â
ââââââââââ¼âââââââââ¼ââââââââ¼âââââââââââââ¤
â 1 â 4 â 89 â 67 â
ââââââââââ¼âââââââââ¼ââââââââ¼âââââââââââââ¤
â 2 â 4 â 5 â null â
ââââââââââ¼âââââââââ¼ââââââââ¼âââââââââââââ¤
â 2 â 23 â 23 â 5 â
ââââââââââ´âââââââââ´ââââââââ´âââââââââââââ
要在多个列上执行此操作,可以在
pl.col
表达式,然后使用前缀/后缀来命名新列。例如:
df.with_columns(
pl.col(['period', 'value']).shift().over('object').prefix("prev_")
)
shape: (5, 5)
ââââââââââ¬âââââââââ¬ââââââââ¬ââââââââââââââ¬âââââââââââââ
â object â period â value â prev_period â prev_value â
â --- â --- â --- â --- â --- â
â i64 â i64 â i64 â i64 â i64 â
ââââââââââªâââââââââªââââââââªââââââââââââââªâââââââââââââ¡
â 1 â 1 â 24 â null â null â
ââââââââââ¼âââââââââ¼ââââââââ¼ââââââââââââââ¼âââââââââââââ¤
â 1 â 2 â 67 â 1 â 24 â
ââââââââââ¼âââââââââ¼ââââââââ¼ââââââââââââââ¼âââââââââââââ¤
â 1 â 4 â 89 â 2 â 67 â
ââââââââââ¼âââââââââ¼ââââââââ¼ââââââââââââââ¼âââââââââââââ¤
â 2 â 4 â 5 â null â null â
ââââââââââ¼âââââââââ¼ââââââââ¼ââââââââââââââ¼âââââââââââââ¤
â 2 â 23 â 23 â 4 â 5 â
ââââââââââ´âââââââââ´ââââââââ´ââââââââââââââ´âââââââââââââ
结束
让我们使用这些数据。
df = pl.DataFrame(
{
"id": [1] * 5 + [2] * 5,
"date": ["2020-01-01", "2020-01-01", "2020-02-01", "2020-02-01", "2020-02-01"] * 2,
"value1": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
"value2": [10, 20, 30, 40, 50, 60, 70, 80, 90, 100],
}
).with_column(pl.col('date').str.strptime(pl.Date))
df
shape: (10, 4)
âââââââ¬âââââââââââââ¬âââââââââ¬âââââââââ
â id â date â value1 â value2 â
â --- â --- â --- â --- â
â i64 â date â i64 â i64 â
âââââââªâââââââââââââªâââââââââªâââââââââ¡
â 1 â 2020-01-01 â 1 â 10 â
âââââââ¼âââââââââââââ¼âââââââââ¼âââââââââ¤
â 1 â 2020-01-01 â 2 â 20 â
âââââââ¼âââââââââââââ¼âââââââââ¼âââââââââ¤
â 1 â 2020-02-01 â 3 â 30 â
âââââââ¼âââââââââââââ¼âââââââââ¼âââââââââ¤
â 1 â 2020-02-01 â 4 â 40 â
âââââââ¼âââââââââââââ¼âââââââââ¼âââââââââ¤
â 1 â 2020-02-01 â 5 â 50 â
âââââââ¼âââââââââââââ¼âââââââââ¼âââââââââ¤
â 2 â 2020-01-01 â 6 â 60 â
âââââââ¼âââââââââââââ¼âââââââââ¼âââââââââ¤
â 2 â 2020-01-01 â 7 â 70 â
âââââââ¼âââââââââââââ¼âââââââââ¼âââââââââ¤
â 2 â 2020-02-01 â 8 â 80 â
âââââââ¼âââââââââââââ¼âââââââââ¼âââââââââ¤
â 2 â 2020-02-01 â 9 â 90 â
âââââââ¼âââââââââââââ¼âââââââââ¼âââââââââ¤
â 2 â 2020-02-01 â 10 â 100 â
âââââââ´âââââââââââââ´âââââââââ´âââââââââ
结束
表达式(以及我们的
表达式)。Polars将并行运行它们。
df.with_columns([
pl.col(["value1", "value2"]).shift().over(['id','date']).prefix("prev_"),
pl.col(["value1", "value2"]).diff().over(['id','date']).suffix("_diff"),
])
shape: (10, 8)
âââââââ¬âââââââââââââ¬âââââââââ¬âââââââââ¬ââââââââââââââ¬ââââââââââââââ¬ââââââââââââââ¬ââââââââââââââ
â id â date â value1 â value2 â prev_value1 â prev_value2 â value1_diff â value2_diff â
â --- â --- â --- â --- â --- â --- â --- â --- â
â i64 â date â i64 â i64 â i64 â i64 â i64 â i64 â
âââââââªâââââââââââââªâââââââââªâââââââââªââââââââââââââªââââââââââââââªââââââââââââââªââââââââââââââ¡
â 1 â 2020-01-01 â 1 â 10 â null â null â null â null â
âââââââ¼âââââââââââââ¼âââââââââ¼âââââââââ¼ââââââââââââââ¼ââââââââââââââ¼ââââââââââââââ¼ââââââââââââââ¤
â 1 â 2020-01-01 â 2 â 20 â 1 â 10 â 1 â 10 â
âââââââ¼âââââââââââââ¼âââââââââ¼âââââââââ¼ââââââââââââââ¼ââââââââââââââ¼ââââââââââââââ¼ââââââââââââââ¤
â 1 â 2020-02-01 â 3 â 30 â null â null â null â null â
âââââââ¼âââââââââââââ¼âââââââââ¼âââââââââ¼ââââââââââââââ¼ââââââââââââââ¼ââââââââââââââ¼ââââââââââââââ¤
â 1 â 2020-02-01 â 4 â 40 â 3 â 30 â 1 â 10 â
âââââââ¼âââââââââââââ¼âââââââââ¼âââââââââ¼ââââââââââââââ¼ââââââââââââââ¼ââââââââââââââ¼ââââââââââââââ¤
â 1 â 2020-02-01 â 5 â 50 â 4 â 40 â 1 â 10 â
âââââââ¼âââââââââââââ¼âââââââââ¼âââââââââ¼ââââââââââââââ¼ââââââââââââââ¼ââââââââââââââ¼ââââââââââââââ¤
â 2 â 2020-01-01 â 6 â 60 â null â null â null â null â
âââââââ¼âââââââââââââ¼âââââââââ¼âââââââââ¼ââââââââââââââ¼ââââââââââââââ¼ââââââââââââââ¼ââââââââââââââ¤
â 2 â 2020-01-01 â 7 â 70 â 6 â 60 â 1 â 10 â
âââââââ¼âââââââââââââ¼âââââââââ¼âââââââââ¼ââââââââââââââ¼ââââââââââââââ¼ââââââââââââââ¼ââââââââââââââ¤
â 2 â 2020-02-01 â 8 â 80 â null â null â null â null â
âââââââ¼âââââââââââââ¼âââââââââ¼âââââââââ¼ââââââââââââââ¼ââââââââââââââ¼ââââââââââââââ¼ââââââââââââââ¤
â 2 â 2020-02-01 â 9 â 90 â 8 â 80 â 1 â 10 â
âââââââ¼âââââââââââââ¼âââââââââ¼âââââââââ¼ââââââââââââââ¼ââââââââââââââ¼ââââââââââââââ¼ââââââââââââââ¤
â 2 â 2020-02-01 â 10 â 100 â 9 â 90 â 1 â 10 â
âââââââ´âââââââââââââ´âââââââââ´âââââââââ´ââââââââââââââ´ââââââââââââââ´ââââââââââââââ´ââââââââââââââ