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