如何在Polars中通过方法链修改列名且不新增列?
在Polars方法链中修改列名(不生成新列)
你遇到的问题是使用with_columns配合name.map时,会保留原列并新增修改后的列,导致列数翻倍,而你需要直接替换原有列名且全程用方法链完成。
问题重现
原代码及错误结果:
import polars as pl df = pl.DataFrame( {"A (%)": [1, 2, 3], "B": [4, 5, 6], "C (Euro)": ["abc", "def", "ghi"]} ).with_columns( pl.all().name.map( lambda c: c.replace(" ", "_") .replace("(%)", "pct") .replace("(Euro)", "euro") .lower() ) ) df.head()
错误输出(6列,保留原列):
shape: (3, 6) ┌───────┬─────┬──────────┬───────┬─────┬────────┐ │ A (%) ┆ B ┆ C (Euro) ┆ a_pct ┆ b ┆ c_euro │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ str ┆ i64 ┆ i64 ┆ str │ ╞═══════╪═════╪══════════╪═══════╪═════╪════════╡ │ 1 ┆ 4 ┆ "abc" ┆ 1 ┆ 4 ┆ "abc" │ │ 2 ┆ 5 ┆ "def" ┆ 2 ┆ 5 ┆ "def" │ │ 3 ┆ 6 ┆ "ghi" ┆ 3 ┆ 6 ┆ "ghi" │ └───────┴─────┴──────────┴───────┴─────┴────────┘
预期输出(3列,替换原列名):
shape: (3, 3) ┌───────┬─────┬────────┐ │ a_pct ┆ b ┆ c_euro │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ str │ ╞═══════╪═════╪════════╡ │ 1 ┆ 4 ┆ "abc" │ │ 2 ┆ 5 ┆ "def" │ │ 3 ┆ 6 ┆ "ghi" │ └───────┴─────┴────────┘
解决方案
原因是with_columns的作用是新增列,而非修改原有列名。要实现直接替换列名,有两种方法:
方法1:使用rename配合自定义函数
rename方法可以接收一个函数,批量对所有列名进行转换,直接替换原有列名,不新增列:
import polars as pl df = pl.DataFrame( {"A (%)": [1, 2, 3], "B": [4, 5, 6], "C (Euro)": ["abc", "def", "ghi"]} ).rename( lambda c: c.replace(" ", "_") .replace("(%)", "pct") .replace("(Euro)", "euro") .lower() ) print(df.head())
方法2:使用select配合name.map
select会重新选择所有列,并通过name.map修改列名,替换原有的列集合:
import polars as pl df = pl.DataFrame( {"A (%)": [1, 2, 3], "B": [4, 5, 6], "C (Euro)": ["abc", "def", "ghi"]} ).select( pl.all().name.map( lambda c: c.replace(" ", "_") .replace("(%)", "pct") .replace("(Euro)", "euro") .lower() ) ) print(df.head())
两种方法都能在方法链中完成操作,且得到你预期的3列结果。
内容的提问来源于stack exchange,提问作者Vega
相关产品推荐
相关产品推荐

