Скажем, у меня есть набор данных в следующем DataFrame:
df=pl.DataFrame({
'x':['a','a','b','b'],
'y':['b','c','c','a'],
'value':[3,5,1,4]
})
df
shape: (4, 3)
┌─────┬─────┬───────┐
│ x ┆ y ┆ value │
│ --- ┆ --- ┆ --- │
│ str ┆ str ┆ i64 │
╞═════╪═════╪═══════╡
│ a ┆ b ┆ 3 │
│ a ┆ c ┆ 5 │
│ b ┆ c ┆ 1 │
│ b ┆ a ┆ 4 │
└─────┴─────┴───────┘
Теперь я хотел бы добавить в этот фрейм данных столбец, который будет содержать обратный
ценить. Я определяю обратное значение как inverse(x, y) == value(y, x). Например, из
пример выше, inverse (a, b) == value(b, a) == 4.
Если бы value(y, x) не существовало, то inverse(x, y) было бы присвоено значение по умолчанию.
значение 0.
Другими словами, я хотел бы добавить столбец inverse, например, который у меня получился бы
что-то вроде этого:
shape: (4, 4)
┌─────┬─────┬───────┬─────────┐
│ x ┆ y ┆ value ┆ inverse │
│ --- ┆ --- ┆ --- ┆ --- │
│ str ┆ str ┆ i64 ┆ i64 │
╞═════╪═════╪═══════╪═════════╡
│ a ┆ b ┆ 3 ┆ 4 │
│ a ┆ c ┆ 5 ┆ 0 │
│ b ┆ c ┆ 1 ┆ 0 │
│ b ┆ a ┆ 4 ┆ 3 │
└─────┴─────┴───────┴─────────┘
Возможно ли это простым и оптимальным способом? Желательно с выражениями?
Заранее большое спасибо.






Вы можете join добавить его к самому себе с помощью псевдонимов, а затем сделать fill_null(0).
df.join(
df.select(
y = "x",
x = "y",
inverse = "value"
),
on=["x","y"], how = "left"
).fill_null(0)
shape: (4, 4)
┌─────┬─────┬───────┬─────────┐
│ x ┆ y ┆ value ┆ inverse │
│ --- ┆ --- ┆ --- ┆ --- │
│ str ┆ str ┆ i64 ┆ i64 │
╞═════╪═════╪═══════╪═════════╡
│ a ┆ b ┆ 3 ┆ 4 │
│ a ┆ c ┆ 5 ┆ 0 │
│ b ┆ c ┆ 1 ┆ 0 │
│ b ┆ a ┆ 4 ┆ 3 │
└─────┴─────┴───────┴─────────┘