Tenho uma Categorical
coluna chamada decile
em meus polares DataFrame df
, com seus valores variando de "01" a "10". Ao tentar converter essa coluna em uma representação numérica via:
df.with_columns(pl.col('decile').cast(pl.Int8))
, os valores convertidos não são mapeados conforme o esperado (ou seja, "01" não é mapeado para 1 e assim por diante), e o intervalo agora também é de 0 a 9, não de 1 a 10.
O estranho é que não importa quais sejam os valores originais da coluna decile
, eles sempre serão mapeados inesperadamente e para [0, 9] ao convertê-los em um tipo de dados inteiro.
Estou tentando converter os valores em tipos de dados inteiros para fins de plotagem.
Aqui está um exemplo reproduzível mínimo:
size = 1e3
df = pl.DataFrame({
"id": np.random.randint(50, size=int(size), dtype=np.uint16),
"amount": np.round(np.random.uniform(10, 100000, int(size)).astype(np.float32), 2),
"quantity": np.random.randint(1, 7, size=int(size), dtype=np.uint16),
})
df = (df
.groupby("id")
.agg(revenue=pl.sum("amount"), tot_quantity=pl.sum("quantity"))
)
df = (df.with_columns(
pl.col('revenue')
.qcut(10, labels=[f'q{i:02}' for i in range(10, 0, -1)])
.alias("decile")
))
Como fazer com que a conversão seja adequada (como seria de esperar que os valores fossem mapeados) e no mesmo intervalo dos valores originais?
A primeira conversão em um pl.Categorical deve sempre ser string (
pl.Utf8
) primeiro e, em seguida, converter de string para int a partir daqui (no seu exemplo, é necessário um pouco mais do que uma conversão direta para separar oq
):