如何使用 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 循环迭代值要好得多。
对于这两个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 循环迭代值要好得多。