连接

类似于其他数据框架库,Polars 支持一系列连接操作。

  • 在单个或多个列上进行连接
  • 左连接
  • 内连接
  • 外连接

数据集

import polars as pl

df_a = pl.DataFrame({"a": [1, 2, 1, 1], "b": ["a", "b", "c", "c"], "c": [0, 1, 2, 3]})

df_b = pl.DataFrame({"foo": [1, 1, 1], "bar": ["a", "c", "c"], "ham": ["let", "var", "const"]})
print(df_a)
shape: (4, 3)
┌─────┬─────┬─────┐
│ a   ┆ b   ┆ c   │
│ --- ┆ --- ┆ --- │
│ i64 ┆ str ┆ i64 │
╞═════╪═════╪═════╡
│ 1   ┆ a   ┆ 0   │
│ 2   ┆ b   ┆ 1   │
│ 1   ┆ c   ┆ 2   │
│ 1   ┆ c   ┆ 3   │
└─────┴─────┴─────┘
print(df_b)
shape: (3, 3)
┌─────┬─────┬───────┐
│ foo ┆ bar ┆ ham   │
│ --- ┆ --- ┆ ---   │
│ i64 ┆ str ┆ str   │
╞═════╪═════╪═══════╡
│ 1   ┆ a   ┆ let   │
│ 1   ┆ c   ┆ var   │
│ 1   ┆ c   ┆ const │
└─────┴─────┴───────┘

急性


out = df_a.join(df_b, left_on=["a", "b"], right_on=["foo", "bar"], how="left")
print(out)
shape: (6, 4)
┌─────┬─────┬─────┬───────┐
│ a   ┆ b   ┆ c   ┆ ham   │
│ --- ┆ --- ┆ --- ┆ ---   │
│ i64 ┆ str ┆ i64 ┆ str   │
╞═════╪═════╪═════╪═══════╡
│ 1   ┆ a   ┆ 0   ┆ let   │
│ 2   ┆ b   ┆ 1   ┆ null  │
│ 1   ┆ c   ┆ 2   ┆ var   │
│ 1   ┆ c   ┆ 2   ┆ const │
│ 1   ┆ c   ┆ 3   ┆ var   │
│ 1   ┆ c   ┆ 3   ┆ const │
└─────┴─────┴─────┴───────┘

惰性


q = df_a.lazy().join(df_b.lazy(), left_on="a", right_on="foo", how="outer")
out = q.collect()
print(out)
shape: (10, 5)
┌─────┬─────┬─────┬──────┬───────┐
│ a   ┆ b   ┆ c   ┆ bar  ┆ ham   │
│ --- ┆ --- ┆ --- ┆ ---  ┆ ---   │
│ i64 ┆ str ┆ i64 ┆ str  ┆ str   │
╞═════╪═════╪═════╪══════╪═══════╡
│ 1   ┆ a   ┆ 0   ┆ a    ┆ let   │
│ 1   ┆ a   ┆ 0   ┆ c    ┆ var   │
│ 1   ┆ a   ┆ 0   ┆ c    ┆ const │
│ 2   ┆ b   ┆ 1   ┆ null ┆ null  │
│ …   ┆ …   ┆ …   ┆ …    ┆ …     │
│ 1   ┆ c   ┆ 2   ┆ c    ┆ const │
│ 1   ┆ c   ┆ 3   ┆ a    ┆ let   │
│ 1   ┆ c   ┆ 3   ┆ c    ┆ var   │
│ 1   ┆ c   ┆ 3   ┆ c    ┆ const │
└─────┴─────┴─────┴──────┴───────┘