我有一个极坐标数据框,如下所示:
shape: (2_655_541, 4)
┌────────────┬────────────┬─────────────────┬─────────────────────┐
│ streamflow ┆ sm_surface ┆ basin_id ┆ time │
│ --- ┆ --- ┆ --- ┆ --- │
│ f32 ┆ f32 ┆ str ┆ datetime[μs] │
╞════════════╪════════════╪═════════════════╪═════════════════════╡
│ null ┆ null ┆ camels_01022500 ┆ 2015-01-01 03:00:00 │
│ null ┆ null ┆ camels_01022500 ┆ 2015-01-01 06:00:00 │
│ null ┆ null ┆ camels_01022500 ┆ 2015-01-01 09:00:00 │
│ null ┆ null ┆ camels_01022500 ┆ 2015-01-01 12:00:00 │
│ null ┆ null ┆ camels_01022500 ┆ 2015-01-01 15:00:00 │
│ … ┆ … ┆ … ┆ … │
│ 0.718293 ┆ 0.40595 ┆ HML_LOBO3 ┆ 2016-12-30 18:00:00 │
│ null ┆ 0.40601 ┆ HML_LOBO3 ┆ 2016-12-30 21:00:00 │
│ null ┆ 0.406075 ┆ HML_LOBO3 ┆ 2016-12-31 00:00:00 │
│ null ┆ 0.406177 ┆ HML_LOBO3 ┆ 2016-12-31 03:00:00 │
│ null ┆ 0.406333 ┆ HML_LOBO3 ┆ 2016-12-31 06:00:00 │
└────────────┴────────────┴─────────────────┴─────────────────────┘
现在我想对每个盆地的数据进行切片,所以我运行下面的代码:
df1 = (valid_ds.y_origin.group_by('basin_id', maintain_order=True).agg(pl.all().slice(0, 2865)).explode(pl.exclude('basin_id')))
结果是这样的:
shape: (2_604_285, 4)
┌─────────────────┬────────────┬────────────┬─────────────────────┐
│ basin_id ┆ streamflow ┆ sm_surface ┆ time │
│ --- ┆ --- ┆ --- ┆ --- │
│ str ┆ f32 ┆ f32 ┆ datetime[μs] │
╞═════════════════╪════════════╪════════════╪═════════════════════╡
│ camels_01022500 ┆ null ┆ null ┆ 2015-01-01 03:00:00 │
│ camels_01022500 ┆ null ┆ null ┆ 2015-01-01 06:00:00 │
│ camels_01022500 ┆ null ┆ null ┆ 2015-01-01 09:00:00 │
│ camels_01022500 ┆ null ┆ null ┆ 2015-01-01 12:00:00 │
│ camels_01022500 ┆ null ┆ null ┆ 2015-01-01 15:00:00 │
│ … ┆ … ┆ … ┆ … │
│ HML_LOBO3 ┆ 0.898755 ┆ 0.424079 ┆ 2016-12-23 15:00:00 │
│ HML_LOBO3 ┆ 0.88542 ┆ 0.419914 ┆ 2016-12-23 18:00:00 │
│ HML_LOBO3 ┆ 0.868826 ┆ 0.417434 ┆ 2016-12-23 21:00:00 │
│ HML_LOBO3 ┆ 0.855195 ┆ 0.416104 ┆ 2016-12-24 00:00:00 │
│ HML_LOBO3 ┆ 0.848972 ┆ 0.415531 ┆ 2016-12-24 03:00:00 │
└─────────────────┴────────────┴────────────┴─────────────────────┘
但是,当我将切片从 (0, 2865) 更改为 (1, 2865) 时,输出变成了这样:
shape: (2_604_285, 4)
┌─────────────────┬────────────┬────────────┬─────────────────────┐
│ basin_id ┆ streamflow ┆ sm_surface ┆ time │
│ --- ┆ --- ┆ --- ┆ --- │
│ str ┆ f32 ┆ f32 ┆ datetime[μs] │
╞═════════════════╪════════════╪════════════╪═════════════════════╡
│ camels_01022500 ┆ null ┆ null ┆ 2015-01-01 06:00:00 │
│ camels_01022500 ┆ null ┆ null ┆ 2015-01-01 09:00:00 │
│ camels_01022500 ┆ null ┆ null ┆ 2015-01-01 12:00:00 │
│ camels_01022500 ┆ null ┆ null ┆ 2015-01-01 15:00:00 │
│ camels_01022500 ┆ null ┆ null ┆ 2015-01-01 18:00:00 │
│ … ┆ … ┆ … ┆ … │
│ HML_LOBO3 ┆ 0.88542 ┆ 0.419914 ┆ 2016-12-23 18:00:00 │
│ HML_LOBO3 ┆ 0.868826 ┆ 0.417434 ┆ 2016-12-23 21:00:00 │
│ HML_LOBO3 ┆ 0.855195 ┆ 0.416104 ┆ 2016-12-24 00:00:00 │
│ HML_LOBO3 ┆ 0.848972 ┆ 0.415531 ┆ 2016-12-24 03:00:00 │
│ HML_LOBO3 ┆ 0.838897 ┆ 0.41831 ┆ 2016-12-24 06:00:00 │
└─────────────────┴────────────┴────────────┴─────────────────────┘
可以看到第一次改变了,但是数据帧的总长度没有改变。
当我使用 slice(100, 2865) 时,结果的长度变为以下:
shape: (2_564_641, 4)
┌─────────────────┬────────────┬────────────┬─────────────────────┐
│ basin_id ┆ streamflow ┆ sm_surface ┆ time │
│ --- ┆ --- ┆ --- ┆ --- │
│ str ┆ f32 ┆ f32 ┆ datetime[μs] │
╞═════════════════╪════════════╪════════════╪═════════════════════╡
│ camels_01022500 ┆ null ┆ null ┆ 2015-01-13 15:00:00 │
│ camels_01022500 ┆ null ┆ null ┆ 2015-01-13 18:00:00 │
│ camels_01022500 ┆ null ┆ null ┆ 2015-01-13 21:00:00 │
│ camels_01022500 ┆ null ┆ null ┆ 2015-01-14 00:00:00 │
│ camels_01022500 ┆ null ┆ null ┆ 2015-01-14 03:00:00 │
│ … ┆ … ┆ … ┆ … │
│ HML_LOBO3 ┆ 0.718293 ┆ 0.40595 ┆ 2016-12-30 18:00:00 │
│ HML_LOBO3 ┆ null ┆ 0.40601 ┆ 2016-12-30 21:00:00 │
│ HML_LOBO3 ┆ null ┆ 0.406075 ┆ 2016-12-31 00:00:00 │
│ HML_LOBO3 ┆ null ┆ 0.406177 ┆ 2016-12-31 03:00:00 │
│ HML_LOBO3 ┆ null ┆ 0.406333 ┆ 2016-12-31 06:00:00 │
└─────────────────┴────────────┴────────────┴─────────────────────┘
len(df3['basin_id'].unique()) = 909, 2564641 // 909 = 2821
很明显
2865-2821
不是100。
那么 slice() 表达式发生了什么以及如何解决它?
我猜混乱来自于
pl.slice
的第二个参数是长度,而不是最后一个索引。因此,要获取从元素 #100 到末尾的切片,您需要类似
pl.slice(100, pl.len()-100)