Tenho um simples pl.DataFrame
com várias colunas que contêm apenas valores booleanos.
import polars as pl
df = pl.DataFrame(
{"s1": [True, True, False], "s2": [False, True, True], "s3": [False, False, False]}
)
shape: (3, 3)
┌───────┬───────┬───────┐
│ s1 ┆ s2 ┆ s3 │
│ --- ┆ --- ┆ --- │
│ bool ┆ bool ┆ bool │
╞═══════╪═══════╪═══════╡
│ true ┆ false ┆ false │
│ true ┆ true ┆ false │
│ false ┆ true ┆ false │
└───────┴───────┴───────┘
Preciso adicionar outra coluna que contenha listas de comprimento variável. Uma lista em qualquer linha individual deve conter o nome da coluna onde os valores das colunas S1
, s2
, e s3
têm um True
valor.
Aqui está o que realmente estou procurando:
shape: (3, 4)
┌───────┬───────┬───────┬──────────────┐
│ s1 ┆ s2 ┆ s3 │ list │
│ --- ┆ --- ┆ --- │ --- │
│ bool ┆ bool ┆ bool │ list[str] │
╞═══════╪═══════╪═══════╡══════════════╡
│ true ┆ false ┆ false │ ["s1"] │
│ true ┆ true ┆ false │ ["s1", "s2"] │
│ false ┆ true ┆ false │ ["s2"] │
└───────┴───────┴───────┴──────────────┘
Você pode criar uma lista de expressões quando/então e então remover os nulos.
Ou
.list.eval()
Primeiro, você pode criar struct de todas as colunas usando
struct
, então você pode usarmap_elements
para aplicar uma função lambda para cada linha. A função lambda cria uma compreensão de lista que inclui o nome da colunacol
se seu valor correspondenteval
for True. Então use alias para a nova coluna comolist
.Alternativamente, você pode fazer isso
imprimir(saída_desejada)
Você poderia
melt
,filter
,group_by.agg
, ejoin
:Saída: