«обратное» значение с кадром данных Polars

Скажем, у меня есть набор данных в следующем 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       │
└─────┴─────┴───────┴─────────┘

Возможно ли это простым и оптимальным способом? Желательно с выражениями?

Заранее большое спасибо.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
149
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете 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       │
└─────┴─────┴───────┴─────────┘

Другие вопросы по теме