代码之家  ›  专栏  ›  技术社区  ›  Dante

如何用升序数字前缀替换极性中的空值?

  •  0
  • Dante  · 技术社区  · 1 年前

    我试图用前缀和升序数字替换数据帧列中的空值(使每个值都是唯一的)。即

    名称 资产编号
    办公椅 无效的
    办公椅 无效的
    办公椅 无效的
    办公椅 CMP-001
    办公椅 CMP-005
    办公椅 无效的
    表格 无效的
    表格 CMP-007

    空值应该替换为类似PREFIX-001、PREFIX-002、,。。。

    2 回复  |  直到 1 年前
        1
  •  2
  •   BallpointBen    1 年前
    df = df.with_columns(
        pl.col("asset_number").fill_null(
            "PREFIX - " + pl.int_range(pl.len()).cast(pl.String)
        )
    )
    
        2
  •  1
  •   Dogbert    1 年前

    这里有一种使用 ordinal 排名超过 asset_number 。要添加前导0,我们使用 .str.pad_start .

    df.with_columns(
        pl.coalesce(
            "asset_number",
            "PREFIX - "
            + pl.all()
            .rank("ordinal")
            .over("asset_number")
            .cast(pl.String)
            .str.pad_start(3, "0"),
        )
    )
    

    输出:

    shape: (8, 2)
    ┌──────────────┬──────────────┐
    │ 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    │
    └──────────────┴──────────────┘
    

    完整代码:

    import polars as pl
    
    df = pl.DataFrame(
        {
            "name": [
                "Office Chair",
                "Office Chair",
                "Office Chair",
                "Office Chair",
                "Office Chair",
                "Office Chair",
                "Table",
                "Table",
            ],
            "asset_number": [
                None,
                None,
                None,
                "CMP - 001",
                "CMP - 005",
                None,
                None,
                "CMP - 007",
            ],
        }
    )
    
    df = df.with_columns(
        pl.coalesce(
            "asset_number",
            "PREFIX - "
            + pl.all()
            .rank("ordinal")
            .over("asset_number")
            .cast(pl.String)
            .str.pad_start(3, "0"),
        )
    )
    
    print(df)