Skip to content

連結

別の DataFrame からデータを連結する方法は以下のようなものがあります:

  • 同じ列を持つ 2 つの DataFrame を 垂直方向 に連結して、より長い DataFrame を作成できます
  • 重複しない列を持つ 2 つの DataFrame を 水平方向 に連結して、より広い DataFrame を作成できます
  • 行数と列数が異なる 2 つの DataFrame を 斜め方向 に連結して、より長くて/または広い DataFrame を作成できます。列名が重複する場合は値が垂直に連結されます。列名が重複しない場合は新しい行と列が追加されます。欠損値は null に設定されます。

垂直方向の連結 - より長くなる

垂直方向の連結では、DataFrames のリストからすべての行を組み合わせて、単一の長い DataFrame を作成します。

concat

df_v1 = pl.DataFrame(
    {
        "a": [1],
        "b": [3],
    }
)
df_v2 = pl.DataFrame(
    {
        "a": [2],
        "b": [4],
    }
)
df_vertical_concat = pl.concat(
    [
        df_v1,
        df_v2,
    ],
    how="vertical",
)
print(df_vertical_concat)

concat

let df_v1 = df!(
        "a"=> &[1],
        "b"=> &[3],
)?;
let df_v2 = df!(
        "a"=> &[2],
        "b"=> &[4],
)?;
let df_vertical_concat = concat(
    [df_v1.clone().lazy(), df_v2.clone().lazy()],
    UnionArgs::default(),
)?
.collect()?;
println!("{}", &df_vertical_concat);

shape: (2, 2)
┌─────┬─────┐
│ a   ┆ b   │
│ --- ┆ --- │
│ i64 ┆ i64 │
╞═════╪═════╡
│ 1   ┆ 3   │
│ 2   ┆ 4   │
└─────┴─────┘

DataFrame のカラム名が異なる場合、垂直方向の連結は失敗します。

水平方向の結合 - 幅を広げる

水平方向の結合では、DataFrames のリストから全ての列を1つの幅広い DataFrame に結合します。

concat

df_h1 = pl.DataFrame(
    {
        "l1": [1, 2],
        "l2": [3, 4],
    }
)
df_h2 = pl.DataFrame(
    {
        "r1": [5, 6],
        "r2": [7, 8],
        "r3": [9, 10],
    }
)
df_horizontal_concat = pl.concat(
    [
        df_h1,
        df_h2,
    ],
    how="horizontal",
)
print(df_horizontal_concat)

concat

let df_h1 = df!(
        "l1"=> &[1, 2],
        "l2"=> &[3, 4],
)?;
let df_h2 = df!(
        "r1"=> &[5, 6],
        "r2"=> &[7, 8],
        "r3"=> &[9, 10],
)?;
let df_horizontal_concat = polars::functions::concat_df_horizontal(&[df_h1, df_h2])?;
println!("{}", &df_horizontal_concat);

shape: (2, 5)
┌─────┬─────┬─────┬─────┬─────┐
│ l1  ┆ l2  ┆ r1  ┆ r2  ┆ r3  │
│ --- ┆ --- ┆ --- ┆ --- ┆ --- │
│ i64 ┆ i64 ┆ i64 ┆ i64 ┆ i64 │
╞═════╪═════╪═════╪═════╪═════╡
│ 1   ┆ 3   ┆ 5   ┆ 7   ┆ 9   │
│ 2   ┆ 4   ┆ 6   ┆ 8   ┆ 10  │
└─────┴─────┴─────┴─────┴─────┘

列が重複している場合は、水平方向の結合は失敗します。

行数が異なる場合は、最大の行数まで null 値で埋められます。

concat

df_h1 = pl.DataFrame(
    {
        "l1": [1, 2],
        "l2": [3, 4],
    }
)
df_h2 = pl.DataFrame(
    {
        "r1": [5, 6, 7],
        "r2": [8, 9, 10],
    }
)
df_horizontal_concat = pl.concat(
    [
        df_h1,
        df_h2,
    ],
    how="horizontal",
)
print(df_horizontal_concat)

concat

let df_h1 = df!(
        "l1"=> &[1, 2],
        "l2"=> &[3, 4],
)?;
let df_h2 = df!(
        "r1"=> &[5, 6, 7],
        "r2"=> &[8, 9, 10],
)?;
let df_horizontal_concat = polars::functions::concat_df_horizontal(&[df_h1, df_h2])?;
println!("{}", &df_horizontal_concat);

shape: (3, 4)
┌──────┬──────┬─────┬─────┐
│ l1   ┆ l2   ┆ r1  ┆ r2  │
│ ---  ┆ ---  ┆ --- ┆ --- │
│ i64  ┆ i64  ┆ i64 ┆ i64 │
╞══════╪══════╪═════╪═════╡
│ 1    ┆ 3    ┆ 5   ┆ 8   │
│ 2    ┆ 4    ┆ 6   ┆ 9   │
│ null ┆ null ┆ 7   ┆ 10  │
└──────┴──────┴─────┴─────┘

対角結合 - 長さと幅が増え、 null が増える

対角結合では、 DataFrames のリストから全ての行と列を1つの長くて/または幅広い DataFrame に結合します。

concat

df_d1 = pl.DataFrame(
    {
        "a": [1],
        "b": [3],
    }
)
df_d2 = pl.DataFrame(
    {
        "a": [2],
        "d": [4],
    }
)

df_diagonal_concat = pl.concat(
    [
        df_d1,
        df_d2,
    ],
    how="diagonal",
)
print(df_diagonal_concat)

concat

let df_d1 = df!(
    "a"=> &[1],
    "b"=> &[3],
)?;
let df_d2 = df!(
        "a"=> &[2],
        "d"=> &[4],)?;
let df_diagonal_concat = polars::functions::concat_df_diagonal(&[df_d1, df_d2])?;
println!("{}", &df_diagonal_concat);

shape: (2, 3)
┌─────┬──────┬──────┐
│ a   ┆ b    ┆ d    │
│ --- ┆ ---  ┆ ---  │
│ i64 ┆ i64  ┆ i64  │
╞═════╪══════╪══════╡
│ 1   ┆ 3    ┆ null │
│ 2   ┆ null ┆ 4    │
└─────┴──────┴──────┘

対角結合では、列名が重複しない場合に null が生成されます。

データフレームの形状が一致せず、重複するセマンティックキーがある場合は、concatenateする代わりに データフレームを結合 することができます。

リチャンキング

concatenationの前に df1df2 という2つのデータフレームがあります。 df1df2 の各列はメモリ上の1つ以上のチャンクに格納されています。デフォルトでは、concatenation中にそれぞれの列のチャンクが単一の新しいチャンクにコピーされます - これを リチャンキング と呼びます。リチャンキングは高コストな操作ですが、将来の操作が高速化されるため、しばしば価値があります。 concatenated DataFrame をリチャンキングしたくない場合は、concatenationの際に rechunk = False を指定することができます。