为什么切片表达式在 Polars DataFrame 中无法获得正确的索引?

问题描述 投票:0回答:1

我有一个极坐标数据框,如下所示:

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() 表达式发生了什么以及如何解决它?

python-3.x slice python-polars
1个回答
0
投票

我猜混乱来自于

pl.slice
的第二个参数是长度,而不是最后一个索引。因此,要获取从元素 #100 到末尾的切片,您需要类似

pl.slice(100, pl.len()-100)
© www.soinside.com 2019 - 2024. All rights reserved.