Eu tenho esse código
import polars as pl
pl.DataFrame({
'id': ['CHECK.US1', 'CHECK.US2', 'CHECK.CA9'],
'libor.M2': [99, 332, 934],
'libor.Y5': [11, -10, 904],
'estr.M2': [99, 271, 741],
'estr.Y3': [-8, -24, 183],
'estr.Y5': [88, 771, 455]
})
o que dá
┌───────────┬──────────┬──────────┬─────────┬─────────┬─────────┐
│ id ┆ libor.M2 ┆ libor.Y5 ┆ estr.M2 ┆ estr.Y3 ┆ estr.Y5 │
│ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │
│ str ┆ i64 ┆ i64 ┆ i64 ┆ i64 ┆ i64 │
╞═══════════╪══════════╪══════════╪═════════╪═════════╪═════════╡
│ CHECK.US1 ┆ 99 ┆ 11 ┆ 99 ┆ -8 ┆ 88 │
│ CHECK.US2 ┆ 332 ┆ -10 ┆ 271 ┆ -24 ┆ 771 │
│ CHECK.CA9 ┆ 934 ┆ 904 ┆ 741 ┆ 183 ┆ 455 │
└───────────┴──────────┴──────────┴─────────┴─────────┴─────────┘
Agora o que estou tentando fazer é renomear as colunas para nomes mais curtos, como
┌───────────┬──────┬──────┬─────┬─────┬─────┐
│ id ┆ M2 ┆ Y5 ┆ M2 ┆ Y3 ┆ Y5 │
│ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │
│ str ┆ i64 ┆ i64 ┆ i64 ┆ i64 ┆ i64 │
╞═══════════╪══════╪══════╪═════╪═════╪═════╡
or
┌───────────┬──────┬──────┬─────┬─────┬─────┐
│ id ┆ libor┆ libor┆ estr┆ estr┆ estr│
│ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │
│ str ┆ i64 ┆ i64 ┆ i64 ┆ i64 ┆ i64 │
╞═══════════╪══════╪══════╪═════╪═════╪═════╡
e então recolher (= soma) nas colunas com o mesmo nome, para que eu obtenha, por exemplo
┌───────────┬──────┬──────┬──────┐
│ id ┆ M2 ┆ Y5 ┆ Y3 │
│ --- ┆ --- ┆ --- ┆ --- │
│ str ┆ i64 ┆ i64 ┆ i64 │
╞═══════════╪══════╪══════╪══════╡
│ CHECK.US1 ┆ 198 ┆ 99 ┆ -8 │
│ CHECK.US2 ┆ 603 ┆ 761 ┆ -24 │
│ CHECK.CA9 ┆ 1675 ┆ 1359 ┆ 183 │
└───────────┴──────┴──────┴──────┘
Tentei renomeá-los primeiro, mas não obtive sucesso polars.exceptions.DuplicateError: the name 'M2' is duplicate
.
Existe uma maneira de conseguir o que estou tentando fazer?
editar: Eu também tentei algo como
rename_func = lambda col: col.split('.')[-1]
new_cols = set([rename_func(c) for c in df.columns])
df.with_columns([
pl.sum_horizontal(pl.all().map(rename_func) == c).alias(c) for c in new_cols
])
mas não funciona muito bem.
Você pode criar um dicionário das colunas a serem agregadas e então usar
pl.sum_horizontal
:Saída:
Você pode criar seus títulos usando
set
então usar regexpl.col
para selecionar essas colunasAlternativamente, você pode fazer um
unpivot
repivot
como esteO unpivot/pivot provavelmente é mais lento, mas para algumas estruturas de dados a primeira abordagem não funciona.