假设我有这个数据框
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 │
└────────┴──────────┴───────┴─────────────┴──────────────┘
现在我想将0
所有行的所有值列设置为value is null
和quantity == 0
。
现在我有这个解决方案
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
])
正确给出
┌────────┬──────────┬───────┬─────────────┬──────────────┐
│ 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 │
└────────┴──────────┴───────┴─────────────┴──────────────┘
但是,我觉得这非常低效,因为我的when
条件是针对每个值列执行的。有没有办法只使用极地内部函数而不使用原生 for 循环来实现这一点?
一次性将条件应用于所有列。也可以替换
alias
为name.keep
:输出:
您可以将列名列表传递进去
pl.col()
并when\then\otherwise
接受Expr
可以包含多列的列表。