Извлечение из столбца, содержащего список структур, с использованием другого столбца, содержащего значения, поля структуPython

Программы на Python
Ответить
Anonymous
 Извлечение из столбца, содержащего список структур, с использованием другого столбца, содержащего значения, поля структу

Сообщение Anonymous »

Рассмотрим пример:

Код: Выделить всё

import polars as pl

df = pl.DataFrame(
[
pl.Series(
"id",
["alpha", "beta"],
),
pl.Series(
"s",
[
[{"x": 0, "y": "a"}, {"x": 1, "y": "b"}, {"x": 0, "y": "c"}],
[{"x": 0, "y": "b"}, {"x": 1, "y": "a"}, {"x": 1, "y": "c"}],
],
),
pl.Series("selector", [0, 1]),
]
)
print(df)
# shape: (2, 3)
# ┌───────┬─────────────────────────────┬──────────┐
# │ id    ┆ s                           ┆ selector │
# │ ---   ┆ ---                         ┆ ---      │
# │ str   ┆ list[struct[2]]             ┆ i64      │
# ╞═══════╪═════════════════════════════╪══════════╡
# │ alpha ┆ [{0,"a"}, {1,"b"}, {0,"c"}] ┆ 0        │
# │ beta  ┆ [{0,"b"}, {1,"a"}, {1,"c"}] ┆ 1        │
# └───────┴─────────────────────────────┴──────────┘

first_try = df.with_columns(
extracted=pl.col("s")
.list.eval(
pl.when(pl.element().struct.field("x").eq(pl.col("selector")))
.then(pl.element().struct.field("y"))
.otherwise(None)
)
.list.drop_nulls()
)
print(first_try)
# error: ComputeError: named columns are not allowed in `list.eval`; consider using `element` or `col("")`

other_try = df.join(
df.explode("s")
.filter(pl.col("s").struct.field("x").eq(pl.col("selector")))
.with_columns(extracted=pl.col("s").struct.field("y"))
.group_by("id")
.agg(pl.col("extracted")),
on="id",
)
print(other_try)
# shape: (2, 4)
# ┌───────┬─────────────────────────────┬──────────┬────────────┐
# │ id    ┆ s                           ┆ selector ┆ extracted  │
# │ ---   ┆ ---                         ┆ ---      ┆ ---        │
# │ str   ┆ list[struct[2]]             ┆ i64      ┆ list[str]  │
# ╞═══════╪═════════════════════════════╪══════════╪════════════╡
# │ alpha ┆ [{0,"a"}, {1,"b"}, {0,"c"}] ┆ 0        ┆ ["a", "c"] │
# │ beta  ┆ [{0,"b"}, {1,"a"}, {1,"c"}] ┆ 1        ┆ ["a", "c"] │
# └───────┴─────────────────────────────┴──────────┴────────────┘

Код: Выделить всё

first_try
не работает, аother_try работает. Ошибка с first_try:

Код: Выделить всё

ComputeError: named columns are not allowed in `list.eval`; consider using `element` or `col("")`
Это привело меня к: https://github.com/pola-rs/polars/issues/7210
Где предлагается использовать group_by, что привело меня кother_try. Мне интересно, возможно, я неправильно понял это предложение, или есть другой способ? Возможно, что-то использует что-то вроде того, как здесь используется «оператор моржа»?

Подробнее здесь: https://stackoverflow.com/questions/788 ... olumn-cont
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»