我正在尝试根据检查条件在输出中创建 2 个新列,但不确定如何做到这一点。
样本 df:
so_df = pl.DataFrame({"low_limit": [1, 3, 0], "high_limit": [3, 4, 2], "value": [0, 5, 1]})
low_limit high_limit value
i64 i64 i64
1 3 0
3 4 5
0 2 1
有效的单列创建代码:
so_df.with_columns(pl.when(pl.col('value') > pl.col('high_limit'))
.then(pl.lit("High"))
.when((pl.col('value') < pl.col('low_limit')))
.then(pl.lit("Low"))
.otherwise(pl.lit("Within Range")).alias('Flag')
)
输出
low_limit high_limit value Flag
i64 i64 i64 str
1 3 0 "Low"
3 4 5 "High"
0 2 1 "Within Range"
问题/疑问:创建 2 列无效
so_df.with_columns(pl.when(pl.col('value') > pl.col('high_limit'))
.then(Flag = pl.lit("High"), Normality = pl.lit("Abnormal"))
.when((pl.col('value') < pl.col('low_limit')))
.then(Flag = pl.lit("Low"), Normality = pl.lit("Abnormal"))
.otherwise(Flag = pl.lit("Within Range"), Normality = pl.lit("Normal"))
)
期望输出:
low_limit high_limit value Flag Normality
i64 i64 i64 str str
1 3 0 "Low" "Abnormal"
3 4 5 "High" "Abnormal"
0 2 1 "Within Range" "Normal"
我知道我可以再执行一次 with_Columns 并再次使用 when-then,但这将需要双倍的计算量。那么我如何才能一次性创建 2 个新列呢?
类似于:
if (condition):
Flag = '',
Normality = ''
您可以选择
pl.struct
然后使用以下方法提取多个值.struct.field(...)
:输出:
pl.struct()
将列合并为单个结构。pl.Expr.struct.field()
将结构取消嵌套到列。