Suponha que eu tenha esse dataframe
import polars as pl
df = pl.DataFrame({
'item': ['CASH', 'CHECK', 'DEBT', 'CHECK', 'CREDIT', 'CASH'],
'quantity': [100, -20, 0, 10, 0, 0],
'value': [99, 47, None, 90, None, 120],
'value_other': [97, 57, None, 91, None, 110],
'value_other2': [94, 37, None, 93, None, 115],
})
┌────────┬──────────┬───────┬─────────────┬──────────────┐
│ item ┆ quantity ┆ value ┆ value_other ┆ value_other2 │
│ --- ┆ --- ┆ --- ┆ --- ┆ --- │
│ str ┆ i64 ┆ i64 ┆ i64 ┆ i64 │
╞════════╪══════════╪═══════╪═════════════╪══════════════╡
│ CASH ┆ 100 ┆ 99 ┆ 97 ┆ 94 │
│ CHECK ┆ -20 ┆ 47 ┆ 57 ┆ 37 │
│ DEBT ┆ 0 ┆ null ┆ null ┆ null │
│ CHECK ┆ 10 ┆ 90 ┆ 91 ┆ 93 │
│ CREDIT ┆ 0 ┆ null ┆ null ┆ null │
│ CASH ┆ 0 ┆ 120 ┆ 110 ┆ 115 │
└────────┴──────────┴───────┴─────────────┴──────────────┘
Agora quero definir todas as colunas de valor 0
para todas as linhas onde value is null
e quantity == 0
.
No momento eu tenho essa solução
cols = ['value', 'value_other', 'value_other2']
df = df.with_columns([
pl.when(pl.col('value').is_null() & (pl.col('quantity') == 0))
.then(0)
.otherwise(pl.col(col))
.alias(col)
for col in cols
])
que dá corretamente
┌────────┬──────────┬───────┬─────────────┬──────────────┐
│ item ┆ quantity ┆ value ┆ value_other ┆ value_other2 │
│ --- ┆ --- ┆ --- ┆ --- ┆ --- │
│ str ┆ i64 ┆ i64 ┆ i64 ┆ i64 │
╞════════╪══════════╪═══════╪═════════════╪══════════════╡
│ CASH ┆ 100 ┆ 99 ┆ 97 ┆ 94 │
│ CHECK ┆ -20 ┆ 47 ┆ 57 ┆ 37 │
│ DEBT ┆ 0 ┆ 0 ┆ 0 ┆ 0 │
│ CHECK ┆ 10 ┆ 90 ┆ 91 ┆ 93 │
│ CREDIT ┆ 0 ┆ 0 ┆ 0 ┆ 0 │
│ CASH ┆ 0 ┆ 120 ┆ 110 ┆ 115 │
└────────┴──────────┴───────┴─────────────┴──────────────┘
No entanto, sinto que isso é muito ineficiente, pois minha when
condição é executada para cada coluna de valor. Existe uma maneira de conseguir isso usando apenas funções internas polares e sem o loop for nativo?
Aplique a condição a todas as colunas de uma vez. Substitua também
alias
porname.keep
:Saída:
Você pode passar uma lista de nomes de colunas
pl.col()
ewhen\then\otherwise
aceitarExpr
que pode conter várias colunas.