如何使用Polars布尔DataFrame掩码修改或重建DataFrame
使用布尔DataFrame作为掩码操作Polars目标DataFrame
示例1:替换目标DataFrame中指定条件的数值
需求:将目标DataFrame里amount列中大于270的数值替换为1000。
代码实现
import polars as pl # 初始化测试DataFrame df = pl.DataFrame({ "amount": [250, 300, 200, 350], "value": [10, 20, 30, 40] }) # 生成布尔掩码DataFrame(仅针对amount列) mask = df.select(pl.col("amount") > 270) # 应用掩码完成值替换 df_updated = df.with_columns( pl.when(mask.to_series()).then(1000).otherwise(pl.col("amount")).alias("amount") ) print(df_updated)
输出结果
shape: (4, 2) ┌────────┬───────┐ │ amount ┆ value │ │ --- ┆ --- │ │ i64 ┆ i64 │ ╞════════╪═══════╡ │ 250 ┆ 10 │ │ 1000 ┆ 20 │ │ 200 ┆ 30 │ │ 1000 ┆ 40 │ └────────┴───────┘
如果需要对全DataFrame所有列的对应掩码位置替换(掩码为同维度布尔DataFrame),可通过循环遍历列实现:
# 生成同维度的布尔掩码DataFrame full_mask = pl.DataFrame({ "amount": [False, True, False, True], "value": [True, False, True, False] }) # 批量替换所有列中掩码为True的位置的值 df_full_updated = df.with_columns([ pl.when(full_mask[col]).then(1000).otherwise(pl.col(col)).alias(col) for col in df.columns ])
示例2:用同维度布尔掩码筛选对应位置的值
需求:保留目标DataFrame中与布尔掩码True位置对应的值,False位置转为None(空值)。
代码实现
import polars as pl # 初始化测试DataFrame和同维度布尔掩码 df = pl.DataFrame({ "amount": [250, 300, 200, 350], "value": [10, 20, 30, 40] }) mask = pl.DataFrame({ "amount": [True, False, True, False], "value": [False, True, False, True] }) # 应用掩码筛选值 df_filtered = df.with_columns([ pl.col(col).when(mask[col]).otherwise(None).alias(col) for col in df.columns ]) print(df_filtered)
输出结果
shape: (4, 2) ┌────────┬───────┐ │ amount ┆ value │ │ --- ┆ --- │ │ i64 ┆ i64 │ ╞════════╪═══════╡ │ 250 ┆ null │ │ null ┆ 20 │ │ 200 ┆ null │ │ null ┆ 40 │ └────────┴───────┘
如果需要筛选整行(仅保留所有列掩码都为True的行),可直接使用all_horizontal()结合where:
# 筛选所有列掩码都为True的行 df_row_filtered = df.where(mask.all_horizontal())
内容的提问来源于stack exchange,提问作者BigChief
相关产品推荐
相关产品推荐

