Я работаю со следующим кодом...
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
?
вы можете использовать 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 ┆ - ┆ - │
└────────┴─────┴───────┴───────┘
Ах, опереди меня на секунды.
Немного короче было бы передать {}
на replace_strict
вместо None, None
.
Ваша неудачная попытка уже была запрошена[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 ┆ - ┆ - │
└────────┴─────┴───────┴───────┘
Очень незначительная вещь, но
with_columns
принимает *args, поэтому вы можете сделатьdf.with_columns(pl.lit(fill_val).alias(c) for c in cols_to_set)
, то есть опустить скобки, что делает его генератором вместо понимания списка, но все равно работает.