我正在阅读一个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"  │
└───────┴─────┴────────┘

How can I replace specific chars in existing column names with function chaining without creating new columns?

推荐答案

您可以简单地将DataFrame.with_columns()替换为DataFrame.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    │
└───────┴─────┴────────┘

有一点很重要(正如Dean MacGregor在 comments 中提到的),DataFrame.with_columns()总是向数据帧添加列. 列名可能与原始数据帧中的列名相同,但在这种情况下,原始列将被新列替换.您可以在文档中看到它:

将列添加到此DataFrame.

添加的列将替换具有相同名称的现有列.

另一方面,DataFrame.select() Select 数据帧的现有列.

另外,如果你只想重命名所有的列,使用DataFrame.rename()可能更自然:

...
.rename(
    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    │
└───────┴─────┴────────┘

Python相关问答推荐

比较两个二元组列表,NP.isin

仅从风格中获取 colored颜色 循环

将numpy数组存储在原始二进制文件中

Pythind 11无法弄清楚如何访问tuple元素

在Python中对分层父/子列表进行排序

对某些列的总数进行民意调查,但不单独列出每列

用合并列替换现有列并重命名

优化器的运行顺序影响PyTorch中的预测

无法连接到Keycloat服务器

在www.example.com中使用`package_data`包含不包含__init__. py的非Python文件

下三角形掩码与seaborn clustermap bug

(Python/Pandas)基于列中非缺失值的子集DataFrame

使用嵌套对象字段的Qdrant过滤

从嵌套极轴列的列表中删除元素

如何为需要初始化的具体类实现依赖反转和接口分离?

在matplotlib中重叠极 map 以创建径向龙卷风图

有没有一种方法可以在朗肯代理中集成向量嵌入

如何在Pandas中用迭代器求一个序列的平均值?

Stats.ttest_ind:提取df值

如何使用count()获取特定日期之间的项目