我有这个代码
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]
})
给出
┌───────────┬──────────┬──────────┬─────────┬─────────┬─────────┐
│ 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 │
└───────────┴──────────┴──────────┴─────────┴─────────┴─────────┘
现在我想做的是将列重命名为较短的名称,例如
┌───────────┬──────┬──────┬─────┬─────┬─────┐
│ 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 │
╞═══════════╪══════╪══════╪═════╪═════╪═════╡
然后在具有相同名称的列上折叠(=总和),这样我得到例如
┌───────────┬──────┬──────┬──────┐
│ id ┆ M2 ┆ Y5 ┆ Y3 │
│ --- ┆ --- ┆ --- ┆ --- │
│ str ┆ i64 ┆ i64 ┆ i64 │
╞═══════════╪══════╪══════╪══════╡
│ CHECK.US1 ┆ 198 ┆ 99 ┆ -8 │
│ CHECK.US2 ┆ 603 ┆ 761 ┆ -24 │
│ CHECK.CA9 ┆ 1675 ┆ 1359 ┆ 183 │
└───────────┴──────┴──────┴──────┘
我首先尝试重命名它们,但是得到了polars.exceptions.DuplicateError: the name 'M2' is duplicate
。
有没有什么办法可以实现我想要做的事情?
编辑:我也尝试过类似
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
])
但它不太起作用。