Левое соединение двух столбцов взорванных поляровPython

Программы на Python
Ответить
Anonymous
 Левое соединение двух столбцов взорванных поляров

Сообщение Anonymous »

Принимая во внимание

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

import polars as pl

df = pl.DataFrame({
"a": [[1, 2], [3]],
"b": [
[{"id": 1, "x": 1}, {"id": 3, "x": 3}],
[{"id": 3, "x": 4}]
]
})

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

┌───────────┬─────────────────┐
│ a         ┆ b               │
│ ---       ┆ ---             │
│ list[i64] ┆ list[struct[2]] │
╞═══════════╪═════════════════╡
│ [1, 2]    ┆ [{1,1}, {3,3}]  │
│ [3]       ┆ [{3,4}]         │
└───────────┴─────────────────┘

Как

  • получить одну строку для каждого выравнивающего элемента a и
  • если список dict в b содержит элемент a в качестве идентификатора
  • тогда иметь соответствующее значение x в столбце b
  • в противном случае b должно быть null

Текущий подход

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

.explode
оба a и b и .filter (ВНУТРЕННЕЕ СОЕДИНЕНИЕ):

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

df.explode("a").explode("b").filter(
pl.col("a") == pl.col("b").struct.field("id")
).select(
pl.col("a"),
pl.col("b").struct.field("x").alias("b")
)
К сожалению, я получаю только (ожидаемое):

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

┌─────┬─────┐
│ a   ┆ b   │
│ --- ┆ --- │
│ i64 ┆ i64 │
╞═════╪═════╡
│ 1   ┆ 1   │
│ 3   ┆ 4   │
└─────┴─────┘
Вместо полного «LEFT JOIN» я стремлюсь:

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

┌─────┬──────┐
│ a   ┆ b    │
│ --- ┆ ---  │
│ i64 ┆ i64  │
╞═════╪══════╡
│ 1   ┆ 1    │
│ 2   ┆ null │
│ 3   ┆ 4    │
└─────┴──────┘
Как эффективно получить желаемый результат, если DataFrame имеет такую ​​структуру?

Подробнее здесь: https://stackoverflow.com/questions/780 ... rs-columns
Ответить

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

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

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

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

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