Как в Polars обновить несколько столбцов одновременно?Python

Программы на Python
Ответить
Anonymous
 Как в Polars обновить несколько столбцов одновременно?

Сообщение Anonymous »

Предположим, у нас есть примерно такая рамка Polars

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

lf = pl.LazyFrame([
pl.Series("a", ...),
pl.Series("b", ...),
pl.Series("c", ...),
pl.Series("i", ...)
])
и такая функция

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

def update(a, b, c, i):
s = a + b + c + i
a /= s
b /= s
c /= s
return a, b, c
это зависит от элементов столбцов a, b, c, а также i.
Как мы можем обновить каждый строку кадра с помощью функции?
Мы могли бы использовать with_columns для независимого обновления строк каждого столбца, но как мы можем сделать это, учитывая зависимость между столбцами?
Редактировать
В ответ к комментариям @roman давайте ужесточим вопрос.
Используйте этот LazyFrame

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

lf = pl.LazyFrame(
[
pl.Series("a", [1, 2, 3, 4], dtype=pl.Int8),
pl.Series("b", [5, 6, 7, 8], dtype=pl.Int8),
pl.Series("c", [9, 0, 1, 2], dtype=pl.Int8),
pl.Series("i", [3, 4, 5, 6], dtype=pl.Int8),
pl.Series("o", [7, 8, 9, 0], dtype=pl.Int8),
]
)
Мы хотим обновить столбцы a, b и c способом, зависящим от столбца i. Столбец o не должен быть изменен. У нас есть функция, которая принимает значения a, b, c & i и возвращает a, b, c & i, где первые три были обновлены, но i остается таким же, как входные данные. После обновления все столбцы должны иметь тот же тип dtype, что и раньше.
Наиболее близкое, что мы можем получить, — это использовать подобную функцию обновления.

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

def update(args):
s = args["a"] + args["b"] + args["c"] + args["i"]
args["a"] /= s
args["b"] /= s
args["c"] /= s
return args.values()
и применяем его вот так

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

(
lf.select(
pl.struct(pl.col("a", "b", "c", "i"))
.map_elements(update, return_dtype=pl.List(pl.Float64))
.list.to_struct(fields=["a", "b", "c", "i"])
.alias("result"),
)
.unnest("result")
.collect()
)
Но здесь есть некоторые проблемы.
  • Мы потеряли столбец o.
    < li>Столбец i стал Float64.
  • Это довольно некрасиво.
Есть ли лучший способ?

Подробнее здесь: https://stackoverflow.com/questions/792 ... ltaneously
Ответить

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

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

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

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

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