Polars(ver 0.20)ではjoinのonで指定したカラムにnullを入れてはダメという話
DataFrame 1
key | value1 |
---|---|
A | 1 |
B | 2 |
null | 3 |
DataFrame 2
key | value2 |
---|---|
A | 4 |
B | 5 |
null | 6 |
polarsでkeyを基に、2つのDataFrameをjoinした際に出来るDataFrameは以下のものを期待するかと思います。実際にPandasやGoogle Colabに入っているPolars(ver 0.17)では以下のような出力がされます。
key | value1 | value2 |
---|---|---|
A | 1 | 4 |
B | 2 | 5 |
null | 3 | 6 |
一方で、現在のstable版であるPolars(ver 0.20)では、nullの部分が無視されて結合されません。
PS C:\Users\user> pip freeze | Select-String "polars"
polars==0.20.5
PS C:\Users\user> python
Python 3.11.6 (tags/v3.11.6:8b6ee5b, Oct 2 2023, 14:57:12) [MSC v.1935 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import polars as pl
>>> df1 = pl.DataFrame({
... 'key': ['A', 'B', None],
... 'value1': [1, 2, 3]
... })
>>> df2 = pl.DataFrame({
... 'key': ['A', 'B', None],
... 'value2': [4, 5, 6]
... })
>>> df1.join(
... df2,
... how='left',
... on='key'
... )
shape: (3, 3)
┌──────┬────────┬────────┐
│ key ┆ value1 ┆ value2 │
│ --- ┆ --- ┆ --- │
│ str ┆ i64 ┆ i64 │
╞══════╪════════╪════════╡
│ A ┆ 1 ┆ 4 │
│ B ┆ 2 ┆ 5 │
│ null ┆ 3 ┆ null │
└──────┴────────┴────────┘
現状の対策としては、一旦onの対象のカラムのnull値を以下のように適当な値で埋めることです。
>>> df1.with_columns(pl.col('key').fill_null('-')).join(
... df2.with_columns(pl.col('key').fill_null('-')),
... how='left',
... on='key'
... ).with_columns(
... pl.when(pl.col('key') == '-').then(
... None
... ).otherwise(
... pl.col('key')
... ).alias('key')
... )
shape: (3, 3)
┌──────┬────────┬────────┐
│ key ┆ value1 ┆ value2 │
│ --- ┆ --- ┆ --- │
│ str ┆ i64 ┆ i64 │
╞══════╪════════╪════════╡
│ A ┆ 1 ┆ 4 │
│ B ┆ 2 ┆ 5 │
│ null ┆ 3 ┆ 6 │
└──────┴────────┴────────┘