Я пытаюсь построить гистограмму некоторых данных в полярах. Как часть моего кода гистограммы, мне нужно дублировать некоторые строки. У меня есть столбец значений, где каждая строка также имеет вес, указывающий, сколько раз строка должна быть добавлена к гистограмме.
Как я могу продублировать свои value
строки в соответствии со столбцом weight
?
Вот несколько примеров данных с целевым рядом:
import polars as pl
df = pl.DataFrame({"value":[1,2,3], "weight":[2, 2, 1]})
print(df)
# shape: (3, 2)
# ┌───────┬────────┐
# │ value ┆ weight │
# │ --- ┆ --- │
# │ i64 ┆ i64 │
# ╞═══════╪════════╡
# │ 1 ┆ 2 │
# │ 2 ┆ 2 │
# │ 3 ┆ 1 │
# └───────┴────────┘
s_target = pl.Series(name = "value", values=[1,1,2,2,3])
print(s_target)
# shape: (5,)
# Series: 'value' [i64]
# [
# 1
# 1
# 2
# 2
# 3
# ]
Как насчет
(
df.with_columns(
pl.col("value").repeat_by(pl.col("weight"))
)
.select(pl.col("value").arr.explode())
)
In [11]: df.with_columns(pl.col('value').repeat_by(pl.col('weight'))).select(pl.col('value').arr.explode())
Out[11]:
shape: (5, 1)
┌───────┐
│ value │
│ --- │
│ i64 │
╞═══════╡
│ 1 │
│ 1 │
│ 2 │
│ 2 │
│ 3 │
└───────┘
Я не знал, что вы можете сделать это так легко, я узнал об этом только во время написания ответа. Поларс такой красивый :)
Оказывается, Repeat_by и последующий взрыв являются идеальными строительными блоками для этой трансформации:
>>> df.select(pl.col('value').repeat_by('weight').arr.explode())
shape: (5, 1)
┌───────┐
│ value │
│ --- │
│ i64 │
╞═══════╡
│ 1 │
│ 1 │
│ 2 │
│ 2 │
│ 3 │
└───────┘