Gostaria de preencher um valor em uma coluna com base no nome de outra coluna, na biblioteca Polars do python (obtive o seguinte DF explodindo os nomes das colunas das minhas variáveis):
Entrada:
Nome | Média | Mediana | Q1 | Variável |
---|---|---|---|---|
Maçã | 2 | 3 | 4 | Média |
Maçã | 2 | 3 | 4 | Mediana |
Maçã | 2 | 3 | 4 | Q1 |
Banana | 1 | 5 | 10 | Média |
Banana | 1 | 5 | 10 | Mediana |
Banana | 1 | 5 | 10 | Q1 |
Saída esperada:
Nome | Média | Mediana | Q1 | Variável | Valor |
---|---|---|---|---|---|
Maçã | 2 | 3 | 4 | Média | 2 |
Maçã | 2 | 3 | 4 | Mediana | 3 |
Maçã | 2 | 3 | 4 | Q1 | 4 |
Banana | 1 | 5 | 10 | Média | 1 |
Banana | 1 | 5 | 10 | Mediana | 5 |
Banana | 1 | 5 | 10 | Q1 | 10 |
Você pode gerar a tabela de entrada aqui:
test = pl.DataFrame(
{
"Name": ["Apple","Apple","Apple","Banana","Banana","Banana"],
"Average": [2,2,2,1,1,1],
"Median": [3,3,3,5,5,5],
"Q1": [4,4,4,10,10,10],
"Variable":["Average","Median","Q1","Average","Median","Q1"]
}
)
Eu tentei:
df = df.with_columns(value = pl.col(f"{pl.col.variable}"))
Mas isso não funciona porque polars percebem o argumento como uma função (?). Alguém sabe como fazer isso?
Nota: Eu também tentei transpor o dataframe, o que, além de ser computacionalmente caro, também não funcionou! Porque ele transporia o DF para um DF de 5 linhas. O que eu preciso é de um DF de (Nome * Número de Variáveis) linhas.
Ou seja, por exemplo, se eu tiver 3 nomes diferentes (por exemplo, Maçã, Banana e Fruta do Dragão) e 3 variáveis (Média, Mediana, Q1), meu DF deverá ter 9 linhas de comprimento!
Você pode usar
when/then()
para verificar se o valor da colunaVariable
é o mesmo que o nome da coluna.coalesce()
para escolher o primeiro resultado não vazio.Você pode aproveitar essa funcionalidade de
polars.when()
epolars.then()
com um mapeamento.Por exemplo,