我正在尝试为 Polars 中的数据构建蒙特卡罗模拟器。 我试图按列进行分组,对组进行重新采样,然后将聚合列表按原始顺序解压。 直到最后一步我都已经解决了,但我陷入了困境,并开始认为我以错误的方式解决了这个问题。
df_original = pl.DataFrame({
'colA': ['A','A','B','B','C','C'],
'colB': [11,12,13,14,15,16],
'colC': [21,22,23,24,25,26]})
shape: (6, 3)
┌──────┬──────┬──────┐
│ colA ┆ colB ┆ colC │
│ --- ┆ --- ┆ --- │
│ str ┆ i64 ┆ i64 │
╞══════╪══════╪══════╡
│ A ┆ 11 ┆ 21 │
│ A ┆ 12 ┆ 22 │
│ B ┆ 13 ┆ 23 │
│ B ┆ 14 ┆ 24 │
│ C ┆ 15 ┆ 25 │
│ C ┆ 16 ┆ 26 │
└──────┴──────┴──────┘
我正在像这样分组和重新采样。 请注意,我在这里使用种子,因此这个示例是可重现的,但是这会运行很多次,最终没有种子。
df_resampled = (
df_original
.group_by('colA', maintain_order=True)
.agg(pl.all())
.sample(fraction=1.0, shuffle=True, seed=9)
)
shape: (3, 3)
┌──────┬───────────┬───────────┐
│ colA ┆ colB ┆ colC │
│ --- ┆ --- ┆ --- │
│ str ┆ list[i64] ┆ list[i64] │
╞══════╪═══════════╪═══════════╡
│ B ┆ [13, 14] ┆ [23, 24] │
│ C ┆ [15, 16] ┆ [25, 26] │
│ A ┆ [11, 12] ┆ [21, 22] │
└──────┴───────────┴───────────┘
我不知道如何分解列表并最终得到这个。 每个组内的原始顺序将被保留。 每次运行时只有组本身会重新洗牌。
shape: (6, 3)
┌──────┬──────┬──────┐
│ colA ┆ colB ┆ colC │
│ --- ┆ --- ┆ --- │
│ str ┆ i64 ┆ i64 │
╞══════╪══════╪══════╡
│ B ┆ 13 ┆ 23 │
│ B ┆ 14 ┆ 24 │
│ C ┆ 15 ┆ 25 │
│ C ┆ 16 ┆ 26 │
│ A ┆ 11 ┆ 21 │
│ A ┆ 12 ┆ 22 │
└──────┴──────┴──────┘
正如@jqurious 在评论中指出的那样,这很容易解决...
df_resampled.explode(pl.exclude("colA"))