Polars(ver 0.20)ではjoinのonで指定したカラムにnullを入れてはダメという話

Welcome file

enter image description here

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    ┆ 14      │
│ B    ┆ 25      │
│ 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    ┆ 14      │
│ B    ┆ 25      │
│ null ┆ 36      │
└──────┴────────┴────────┘
Next Post Previous Post