使用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
相关产品推荐
相关产品推荐

