I cannot use the pl.exclude() selector as index in pl.DataFrame.unpivot despite the documentation of this method type hinting the index parameter as follows.
index: 'ColumnNameOrSelector | Sequence[ColumnNameOrSelector] | None' = None
The follow code can be used to reproduce the error.
import polars as pl
df = pl.DataFrame({
    'foo' : ['one', 'two', 'three'],
    'bar' : ['four', 'five', 'six'],
    'baz' : [10, 20, 30],
    'qux' : [50, 60, 70]
})
column_list = ['baz', 'qux']
df.unpivot(column_list, index=pl.exclude(column_list))
TypeError: argument 'index': 'Expr' object cannot be converted to 'PyString'
Moreover, using the columns explicitly works fine.
df.unpivot(column_list, index=['foo', 'bar'])
So, how can column selectors be used in pl.DataFrame.unpivot?
pl.exclude is a "regular" polars expression (of type pl.Expr). Selectors are special objects (also expressions, but of a specific subtype cs._selector_proxy_) that can be found in pl.selectors.
import polars.selectors as cs
column_list = ['baz', 'qux']
df.unpivot(column_list, index=cs.exclude(column_list))
shape: (6, 4)
┌───────┬──────┬──────────┬───────┐
│ foo   ┆ bar  ┆ variable ┆ value │
│ ---   ┆ ---  ┆ ---      ┆ ---   │
│ str   ┆ str  ┆ str      ┆ i64   │
╞═══════╪══════╪══════════╪═══════╡
│ one   ┆ four ┆ baz      ┆ 10    │
│ two   ┆ five ┆ baz      ┆ 20    │
│ three ┆ six  ┆ baz      ┆ 30    │
│ one   ┆ four ┆ qux      ┆ 50    │
│ two   ┆ five ┆ qux      ┆ 60    │
│ three ┆ six  ┆ qux      ┆ 70    │
└───────┴──────┴──────────┴───────┘
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With