如何使用 Polars 迭代地根据另一列分配列值

How to assign column values based on another column iteratively with Polars

对于这两个dfs,我想检查df1["TS"]中的每一个i,如果df["TS"] == df1["TS},然后在对应的"Dr"中赋值我到“mmsi”列:

df = pl.DataFrame({"TS": [1, 2, 3, 4, 5, 6, 7], "mmsi":[11,12,13,14,15,16,17]})


df1 = pl.DataFrame({
"TS": [4, 6, 7], 
"Dr": [21,22,23]})  

我希望 df["mmsi"] 的输出为:[11,12,13,21,15,22,23]

我建议使用“左”join, followed by a fill_null 来填充 Dr 未找到的值。

df.join(
    df1,
    on="TS",
    how="left"
).with_column(pl.col('Dr').fill_null(pl.col('mmsi')))
shape: (7, 3)
┌─────┬──────┬─────┐
│ TS  ┆ mmsi ┆ Dr  │
│ --- ┆ ---  ┆ --- │
│ i64 ┆ i64  ┆ i64 │
╞═════╪══════╪═════╡
│ 1   ┆ 11   ┆ 11  │
├╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌┤
│ 2   ┆ 12   ┆ 12  │
├╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌┤
│ 3   ┆ 13   ┆ 13  │
├╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌┤
│ 4   ┆ 14   ┆ 21  │
├╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌┤
│ 5   ┆ 15   ┆ 15  │
├╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌┤
│ 6   ┆ 16   ┆ 22  │
├╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌┤
│ 7   ┆ 17   ┆ 23  │
└─────┴──────┴─────┘

您的结果在 Dr 列中。如果需要,您可以 drop/rename 列,这样 mmsi 就是最后一列。

df = (
    df.join(df1, on="TS", how="left")
    .with_column(pl.col("Dr").fill_null(pl.col("mmsi")))
    .drop("mmsi")
    .rename({"Dr": "mmsi"})
)
print(df)
shape: (7, 2)
┌─────┬──────┐
│ TS  ┆ mmsi │
│ --- ┆ ---  │
│ i64 ┆ i64  │
╞═════╪══════╡
│ 1   ┆ 11   │
├╌╌╌╌╌┼╌╌╌╌╌╌┤
│ 2   ┆ 12   │
├╌╌╌╌╌┼╌╌╌╌╌╌┤
│ 3   ┆ 13   │
├╌╌╌╌╌┼╌╌╌╌╌╌┤
│ 4   ┆ 21   │
├╌╌╌╌╌┼╌╌╌╌╌╌┤
│ 5   ┆ 15   │
├╌╌╌╌╌┼╌╌╌╌╌╌┤
│ 6   ┆ 22   │
├╌╌╌╌╌┼╌╌╌╌╌╌┤
│ 7   ┆ 23   │
└─────┴──────┘

采取步骤,“左”联接将产生以下结果。

df.join(
    df1,
    on="TS",
    how="left"
)
shape: (7, 3)
┌─────┬──────┬──────┐
│ TS  ┆ mmsi ┆ Dr   │
│ --- ┆ ---  ┆ ---  │
│ i64 ┆ i64  ┆ i64  │
╞═════╪══════╪══════╡
│ 1   ┆ 11   ┆ null │
├╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌╌┤
│ 2   ┆ 12   ┆ null │
├╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌╌┤
│ 3   ┆ 13   ┆ null │
├╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌╌┤
│ 4   ┆ 14   ┆ 21   │
├╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌╌┤
│ 5   ┆ 15   ┆ null │
├╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌╌┤
│ 6   ┆ 16   ┆ 22   │
├╌╌╌╌╌┼╌╌╌╌╌╌┼╌╌╌╌╌╌┤
│ 7   ┆ 17   ┆ 23   │
└─────┴──────┴──────┘

fill_null 步骤将使用 mmsi 列中的相应值填充 Dr 列中的任何缺失值。

这样做的性能比使用 for 循环迭代值要好得多。