替换现有列名称中的字符而不创建新列

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

我正在读取 csv 文件,需要将列名称规范化作为更大函数链接操作的一部分。我想用函数链来完成所有事情。

使用推荐的

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()

我明白了

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"   │
└───────┴─────┴──────────┴───────┴─────┴────────┘

而不是预期的

shape: (3, 3)
┌───────┬─────┬────────┐
│ a_pct ┆ b   ┆ c_euro │
│ ---   ┆ --- ┆ ---    │ 
│ i64   ┆ i64 ┆ str    │
╞═══════╪═════|════════╡
│ 1     ┆ 4   ┆ "abc"  │
│ 2     ┆ 5   ┆ "def"  │
│ 3     ┆ 6   ┆ "ghi"  │
└───────┴─────┴────────┘

如何使用函数链替换现有列名称中的特定字符而不创建新列?

python dataframe replace python-polars chaining
1个回答
0
投票

您可以简单地将

with_columns()
替换为
select()
:

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()
    )
)

┌───────┬─────┬────────┐
│ a_pct ┆ b   ┆ c_euro │
│ ---   ┆ --- ┆ ---    │
│ i64   ┆ i64 ┆ str    │
╞═══════╪═════╪════════╡
│ 1     ┆ 4   ┆ abc    │
│ 2     ┆ 5   ┆ def    │
│ 3     ┆ 6   ┆ ghi    │
└───────┴─────┴────────┘

在你的情况下,使用

DataFrame.rename()
可能也更简单:

...
.rename(
    lambda c: c.replace(" ", "_")
        .replace("(%)", "pct")
        .replace("(Euro)", "euro")
        .lower()
)
© www.soinside.com 2019 - 2024. All rights reserved.