发行:

我有一个列名,它可以根据一些函数参数更改其前缀和后缀,但列名的一部分始终是相同的.我需要将该列重命名为便于在不同工作流中引用的名称.我正在寻找找到我要查找的列并将其重命名为我想要的名称的最快方法.

我使用for循环来判断字符串的一部分是否在每一列中,但我认为这不是基于正则表达式过滤重命名列的最有效的方法.

解决方案+Reprex

这就是我想出来的:


data = pl.DataFrame({
    "foo": [1, 2, 3, 4, 5],
    "bar": [5, 4, 3, 2, 1],
    "std_volatility_pct_21D": [0.1, 0.2, 0.15, 0.18, 0.16]
})

for col in data.columns:
    if "volatility_pct" in col:
        new_data = data.rename({col: "realized_volatility"})

业绩表现

import polars as pl
import polars.selectors as cs

data = pl.DataFrame(
    {
        "foo": [1, 2, 3, 4, 5],
        "bar": [5, 4, 3, 2, 1],
        "std_volatility_pct_21D": [0.1, 0.2, 0.15, 0.18, 0.16],
    }
)


# 1
def rename_volatility_column(data):
    for col in data.columns:
        if "volatility_pct" in col:
            return data.rename({col: "realized_volatility"})
    return data


%timeit rename_volatility_column(data)


# 2
def adjust_volatility_column(data):
    return data.select(
        ~cs.contains("volatility_pct"),
        cs.contains("volatility_pct").alias("realized_volatility"),
    )


%timeit adjust_volatility_column(data)

# 3
%timeit data.rename(lambda col: "realized_volatility" if "volatility_pct" in col else col)

#1
18.8 µs ± 636 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each)

#2
330 µs ± 11.7 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)

#3
133 µs ± 7.71 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)

推荐答案

你可以用波尔斯column selectors.

  • ~cs.contains("volatility_pct") Select do not包含volatility_pct的所有列
  • cs.contains("volatility_pct").alias("realized_volatility") Select 包含volatility_pct的所有列,并将其重命名为realized_volatility
import polars.selectors as cs

(
    data
    .select(
        ~cs.contains("volatility_pct"),
        cs.contains("volatility_pct").alias("realized_volatility"),
    )
)

Python-3.x相关问答推荐

Pandas 数据帧断言等同于NaN

如何从拼图分区数据集中读取数据到Polar

按小时和日期对Pandas 数据帧进行分组

使用具有相同索引的多次出现的索引列表更新NumPy数组

正确的本地react 方式-Django身份验证

如何计算累积几何平均数?

通过在不重新索引的情况下采用最高概率的百分比,有效地转换 0/1 列表中的概率列表

按字母顺序排序列表 (OrderFilter),条件是值为 '' 的条目位于列表 DRF 的末尾

如何在 histplot 中标记核密度估计

将 pandas Timestamp() 转换为 datetime.datetime() 以支持 peewee DateTimeField()

如何通过从特定列创建分组多标题来reshape 数据框?

列出相同索引的Pandas

ImportError:无法从jinja2导入名称escape

预分配一个无列表

Pandas 的 EMA 与股票的 EMA 不匹配?

aiohttp+sqlalchemy:在回滚无效事务之前无法重新连接

无 Python 错误/错误?

如何等待 create_task() 创建的任务完成?

带有数千个逗号刻度标签的 MatPlotLib 美元符号

如何对字典的函数输出列表进行单元测试?