从数据透视重命名列的有效方法

问题描述 投票:0回答:1

当前透视正在使用下划线将“值”列和“列”列中的值作为新列名称连接起来。以下数据示例,新列名称 = "monthly_qty" + "_" + "product_a"

>>> data = pl.DataFrame({"month":["Jan", "Jan", "Feb", "Feb", "Mar", "Mar"], "type":["product_a", "product_b"]*3, "monthly_qty":[10,20]*3, "monthly_amt":[5., 8.]*3})
>>> data
shape: (6, 4)
┌───────┬───────────┬─────────────┬─────────────┐
│ month ┆ type      ┆ monthly_qty ┆ monthly_amt │
│ ---   ┆ ---       ┆ ---         ┆ ---         │
│ str   ┆ str       ┆ i64         ┆ f64         │
╞═══════╪═══════════╪═════════════╪═════════════╡
│ Jan   ┆ product_a ┆ 10          ┆ 5.0         │
│ Jan   ┆ product_b ┆ 20          ┆ 8.0         │
│ Feb   ┆ product_a ┆ 10          ┆ 5.0         │
│ Feb   ┆ product_b ┆ 20          ┆ 8.0         │
│ Mar   ┆ product_a ┆ 10          ┆ 5.0         │
│ Mar   ┆ product_b ┆ 20          ┆ 8.0         │
└───────┴───────────┴─────────────┴─────────────┘
>>> data = data.pivot(on="type", index="month")
>>> data
shape: (3, 5)
┌───────┬───────────────────────┬───────────────────────┬───────────────────────┬───────────────────────┐
│ month ┆ monthly_qty_product_a ┆ monthly_qty_product_b ┆ monthly_amt_product_a ┆ monthly_amt_product_b │
│ ---   ┆ ---                   ┆ ---                   ┆ ---                   ┆ ---                   │
│ str   ┆ i64                   ┆ i64                   ┆ f64                   ┆ f64                   │
╞═══════╪═══════════════════════╪═══════════════════════╪═══════════════════════╪═══════════════════════╡
│ Jan   ┆ 10                    ┆ 20                    ┆ 5.0                   ┆ 8.0                   │
│ Feb   ┆ 10                    ┆ 20                    ┆ 5.0                   ┆ 8.0                   │
│ Mar   ┆ 10                    ┆ 20                    ┆ 5.0                   ┆ 8.0                   │
└───────┴───────────────────────┴───────────────────────┴───────────────────────┴───────────────────────┘

我希望将列重命名为如下,但不确定什么是最有效的方法。

  • 旧列=“monthly_qty_product_a”
  • new_column =“产品_a:每月数量”

我现在能想到的就是这个,前提是下划线的个数是固定的。

>>> new_cols = {col:col if col=="month" else f"{'_'.join(col.split('_')[2:])}:{'_'.join(col.split('_')[0:2])}"for col in data.columns}
>>> data.rename(new_cols)
shape: (3, 5)
┌───────┬───────────────────────┬───────────────────────┬───────────────────────┬───────────────────────┐
│ month ┆ product_a:monthly_qty ┆ product_b:monthly_qty ┆ product_a:monthly_amt ┆ product_b:monthly_amt │
│ ---   ┆ ---                   ┆ ---                   ┆ ---                   ┆ ---                   │
│ str   ┆ i64                   ┆ i64                   ┆ f64                   ┆ f64                   │
╞═══════╪═══════════════════════╪═══════════════════════╪═══════════════════════╪═══════════════════════╡
│ Jan   ┆ 10                    ┆ 20                    ┆ 5.0                   ┆ 8.0                   │
│ Feb   ┆ 10                    ┆ 20                    ┆ 5.0                   ┆ 8.0                   │
│ Mar   ┆ 10                    ┆ 20                    ┆ 5.0                   ┆ 8.0                   │
└───────┴───────────────────────┴───────────────────────┴───────────────────────┴───────────────────────┘

如果值列有多个下划线,则这将不起作用,例如“每月增长_pct”

有更好的方法吗?非常感谢任何建议

谢谢!

python python-polars
1个回答
0
投票

DataFrame.pivot中无法控制此命名。

我建议通过将列

monthly_qty
重命名为
monthly_qty<CHAR>
来稍微修改您的长格式数据框(6 x 4),其中
<CHAR>
是您确信不存在的字符,例如
!

data = data.rename({"monthly_qty":"monthly_qty!"})

继续进行枢轴操作,然后在重命名逻辑中的

!
上进行拆分。

© www.soinside.com 2019 - 2024. All rights reserved.