You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Polars with_columns时,如何减少代码/表达式重复?

减少Polars代码重复的其他可行方法

针对你用Polars处理current和history两组列的场景,除了已经用到的循环优化,还有这些方法可以进一步减少代码重复:

1. 封装成单一职责的函数

把生成日期范围、删除原列的逻辑打包成函数,复用性和可读性都会提升,后续修改规则也只需要改一处:

def add_tpoints_and_drop(df: pl.DataFrame, prefix: str) -> pl.DataFrame:
    start_col = f"{prefix}_start"
    end_col = f"{prefix}_end"
    return df.with_columns(
        pl.date_ranges(
            pl.col(start_col),
            pl.col(end_col),
            "1mo",
            closed="left"
        ).alias(f"{prefix}_tpoints")
    ).drop(start_col, end_col)

# 调用函数处理两组列
df = add_tpoints_and_drop(df, "current")
df = add_tpoints_and_drop(df, "history")

2. 批量生成表达式,一次性执行操作

Polars的API更适合批量处理,一次性生成所有需要的表达式,再统一执行with_columns和drop,减少中间DataFrame的生成,效率更高:

exprs = []
drop_cols = []

for prefix in ["current", "history"]:
    start = f"{prefix}_start"
    end = f"{prefix}_end"
    exprs.append(
        pl.date_ranges(pl.col(start), pl.col(end), "1mo", closed="left").alias(f"{prefix}_tpoints")
    )
    drop_cols.extend([start, end])

# 一次完成所有列的添加和删除
df = df.with_columns(exprs).drop(drop_cols)

3. 自动匹配列前缀,提升扩展性

如果后续可能新增类似规则的列(比如future_start/future_end),可以通过列名前缀自动识别需要处理的列,不用硬编码前缀列表:

# 自动提取所有符合规则的前缀
prefixes = {col.split("_")[0] for col in df.columns if col.endswith("_start")}

exprs = []
drop_cols = []
for prefix in prefixes:
    start = f"{prefix}_start"
    end = f"{prefix}_end"
    exprs.append(
        pl.date_ranges(pl.col(start), pl.col(end), "1mo", closed="left").alias(f"{prefix}_tpoints")
    )
    drop_cols.extend([start, end])

df = df.with_columns(exprs).drop(drop_cols)

内容的提问来源于stack exchange,提问作者bzm3r

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 11:49:55