Заполните несколько столбцов поляров постоянным значением

Я работаю со следующим кодом...

import polars as pl


df = pl.DataFrame({
    'region': ['GB', 'FR', 'US'],
    'qty':    [3, 6, -8],
    'price':  [100, 102, 95],
    'tenor':   ['1Y', '6M', '2Y'],
})

cols_to_set = ['price', 'tenor']
fill_val    = '-'

df.with_columns([pl.lit(fill_val).alias(c) for c in cols_to_set])

... со следующим выводом.

shape: (3, 4)
┌────────┬─────┬───────┬───────┐
│ region ┆ qty ┆ price ┆ tenor │
│ ---    ┆ --- ┆ ---   ┆ ---   │
│ str    ┆ i64 ┆ str   ┆ str   │
╞════════╪═════╪═══════╪═══════╡
│ GB     ┆ 3   ┆ -     ┆ -     │
│ FR     ┆ 6   ┆ -     ┆ -     │
│ US     ┆ -8  ┆ -     ┆ -     │
└────────┴─────┴───────┴───────┘

Вместо списка выражений pl.lit я подумал, что можно использовать одно pl.lit(fill_val).alias(cols_to_set). Однако это вылетает с ошибкой

TypeError: argument 'name': 'list' object cannot be converted to 'PyString'

Есть ли способ упростить вышеизложенное и установить для всех столбцов в cols_to_set определенное постоянное значение fill_val?

Очень незначительная вещь, но with_columns принимает *args, поэтому вы можете сделать df.with_columns(pl.lit(fill_val).alias(c) for c in cols_to_set), то есть опустить скобки, что делает его генератором вместо понимания списка, но все равно работает.

Dean MacGregor 13.08.2024 19:48
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
1
54
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

вы можете использовать replace_strict():

df.with_columns(pl.col(cols_to_set).replace_strict(None, None, default = '-'))
┌────────┬─────┬───────┬───────┐
│ region ┆ qty ┆ price ┆ tenor │
│ ---    ┆ --- ┆ ---   ┆ ---   │
│ str    ┆ i64 ┆ str   ┆ str   │
╞════════╪═════╪═══════╪═══════╡
│ GB     ┆ 3   ┆ -     ┆ -     │
│ FR     ┆ 6   ┆ -     ┆ -     │
│ US     ┆ -8  ┆ -     ┆ -     │
└────────┴─────┴───────┴───────┘

Ах, опереди меня на секунды.

Hericks 13.08.2024 18:25

Немного короче было бы передать {} на replace_strict вместо None, None.

Hericks 13.08.2024 18:26

Ваша неудачная попытка уже была запрошена[1]

Вы можете использовать map() как альтернативу списку:

df.with_columns(map(pl.lit("-").alias, cols_to_set))

Для «выражения одной полярности» это также возможно с помощью «когда/то» + .fill_null()

df.with_columns(pl.when(False).then(pl.col(cols_to_set)).fill_null("-"))
shape: (3, 4)
┌────────┬─────┬───────┬───────┐
│ region ┆ qty ┆ price ┆ tenor │
│ ---    ┆ --- ┆ ---   ┆ ---   │
│ str    ┆ i64 ┆ str   ┆ str   │
╞════════╪═════╪═══════╪═══════╡
│ GB     ┆ 3   ┆ -     ┆ -     │
│ FR     ┆ 6   ┆ -     ┆ -     │
│ US     ┆ -8  ┆ -     ┆ -     │
└────────┴─────┴───────┴───────┘

1. https://github.com/pola-rs/polars/issues/12749

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

Похожие вопросы

Поиск слова минимальной длины в заданной строке
Как обобщить функцию подгонки, чтобы позволить подгонке кривой sciPy определить количество входных данных
Наследование классов, где дочерними элементами являются простые классы, состоящие только из переменных
Pytorch — RuntimeError: ожидалось, что все тензоры будут на одном устройстве, но обнаружено как минимум два устройства: процессор и cuda:0
Получите логическое выражение из иерархического DataFrame Pandas
Правильное использование MPI с многопоточными функциями NumPy
Как получить значение указанного индексного номера в результате сортировки столбца и заполнить его нулевым значением, если оно отсутствует?
Почему при нажатии мыши на экране не появляются крестики?
Ошибка в cv2.rectangle после переворота изображения с нарезкой: «Макет выходного массива img несовместим с cv::Mat»
Python, elif вызвал проблему, а остальное - нет