如何用带递增编号的前缀替换Polars数据框中的空值?
替换Polars数据框空值为带递增编号的唯一前缀值
全局递增编号方案
如果需要给所有asset_number列的空值生成全局唯一的递增编号,可使用以下代码:
import polars as pl # 原始数据框 df = pl.from_repr(""" ┌──────────────┬──────────────┐ │ name ┆ asset_number │ │ --- ┆ --- │ │ str ┆ str │ ╞══════════════╪══════════════╡ │ Office Chair ┆ null │ │ Office Chair ┆ null │ │ Office Chair ┆ null │ │ Office Chair ┆ CMP - 001 │ │ Office Chair ┆ CMP - 005 │ │ Office Chair ┆ null │ │ Table ┆ null │ │ Table ┆ CMP - 007 │ └──────────────┴──────────────┘ """) # 替换空值为带递增编号的前缀值 df = df.with_columns( # 为所有空值生成从1开始的全局递增序号 pl.col("asset_number").is_null().cum_count().add(1).alias("null_idx") ).with_columns( pl.when(pl.col("asset_number").is_null()) .then(pl.format("PREFIX - {:03d}", pl.col("null_idx"))) .otherwise(pl.col("asset_number")) .alias("asset_number") ).drop("null_idx") print(df)
执行后输出结果:
┌──────────────┬──────────────┐ │ name ┆ asset_number │ │ --- ┆ --- │ │ str ┆ str │ ╞══════════════╪══════════════╡ │ Office Chair ┆ PREFIX - 001 │ │ Office Chair ┆ PREFIX - 002 │ │ Office Chair ┆ PREFIX - 003 │ │ Office Chair ┆ CMP - 001 │ │ Office Chair ┆ CMP - 005 │ │ Office Chair ┆ PREFIX - 004 │ │ Table ┆ PREFIX - 005 │ │ Table ┆ CMP - 007 │ └──────────────┴──────────────┘
按分组递增编号方案
如果需要按name列分组,让每个分组内的空值单独生成递增编号,可修改为以下代码:
df = df.with_columns( # 按name分组,为组内空值生成从1开始的递增序号 pl.col("asset_number").is_null().cum_count().add(1).over("name").alias("null_idx") ).with_columns( pl.when(pl.col("asset_number").is_null()) .then(pl.format("PREFIX - {:03d}", pl.col("null_idx"))) .otherwise(pl.col("asset_number")) .alias("asset_number") ).drop("null_idx") print(df)
执行后输出结果:
┌──────────────┬──────────────┐ │ name ┆ asset_number │ │ --- ┆ --- │ │ str ┆ str │ ╞══════════════╪══════════════╡ │ Office Chair ┆ PREFIX - 001 │ │ Office Chair ┆ PREFIX - 002 │ │ Office Chair ┆ PREFIX - 003 │ │ Office Chair ┆ CMP - 001 │ │ Office Chair ┆ CMP - 005 │ │ Office Chair ┆ PREFIX - 004 │ │ Table ┆ PREFIX - 001 │ │ Table ┆ CMP - 007 │ └──────────────┴──────────────┘
代码说明
pl.col("asset_number").is_null():标记出asset_number列的空值行cum_count().add(1):对空值行累计计数并加1,让序号从1开始(默认从0起始)pl.format("PREFIX - {:03d}", ...):将序号格式化为三位补零的数字,与前缀拼接成目标格式over("name"):仅在需要分组编号时添加,实现分组内独立计数逻辑
内容的提问来源于stack exchange,提问作者Dante
相关产品推荐
相关产品推荐

