У меня есть фрейм данных Polars, который выглядит так, как показано ниже.
Я хотел бы создать новый столбец, который представляет собой набор значений в val1, val2 и val3. Например,
Я могу сделать что-то вроде этого,
import polars as pl
df = pl.DataFrame({
'id': [1, 2, 3],
'attribute': [True, True, False],
'val1': ['A', 'A', 'A'],
'val2': ['A', 'A', 'B'],
'val3': ['A', 'B', 'C'],
})
df = df.with_columns([pl.struct('^val.*$').alias('set')])
df = df.with_columns(pl.col('set').apply(lambda x: set(x.values())))
Однако с применением это предсказуемо медленно. Есть ли способ сделать это, используя встроенную функциональность Polars?
Возможно, за него проголосовали, потому что ваш пример не работает. Если вы также не предоставляете код для создания вашего примера фрейма данных, например. df = ...
- требуется, чтобы люди воссоздали его вручную.
@Chris, пожалуйста, опубликуйте воспроизводимый пример вместе с ожидаемым результатом
@jqurious, спасибо, что указали на это. Я сделал пример работоспособным.
@ignoring_gravity, спасибо, что указали на это. Я сделал пример работоспособным.
@ ΩΠΟΚΕΚΡΥΜΜΕΝΟΣ, спасибо, что указали на этот вопрос. Это очень близко к тому, что мне нужно. Использование "arr" с уникальной разблокировкой. К сожалению, это все еще не так быстро, как хотелось бы, но, по крайней мере, я знаю, что это не из-за заявки сейчас.
По сути, это вариант https://stackoverflow.com/a/75387840/, как указал @ΩΠΟΚΕΚΡΥΜΜΕΝΟΣ.
df.with_columns(
pl.concat_list(pl.col("^val.*$"))
.arr.eval(
pl.element().unique(maintain_order=True).drop_nulls(),
parallel=True)
.alias("set")
)
shape: (3, 6)
┌─────┬───────────┬──────┬──────┬──────┬─────────────────┐
│ id | attribute | val1 | val2 | val3 | set │
│ --- | --- | --- | --- | --- | --- │
│ i64 | bool | str | str | str | list[str] │
╞═════╪═══════════╪══════╪══════╪══════╪═════════════════╡
│ 1 | true | A | A | A | ["A"] │
│ 2 | true | A | A | B | ["A", "B"] │
│ 3 | false | A | B | C | ["A", "B", "C"] │
└─────┴───────────┴──────┴──────┴──────┴─────────────────┘
Подойдет ли вам какое-либо из этих решений? stackoverflow.com/questions/75372024/…