
本文介绍在 Polars 中高效、向量化地将仅含整数值(如 1.0, 2.0)的浮点列(f64/f32)转为整型(i64),同时保留含小数的值不变,避免逐行判断,兼顾性能与类型安全。
本文介绍在 polars 中高效、向量化地将仅含整数值(如 `1.0`, `2.0`)的浮点列(`f64`/`f32`)转为整型(`i64`),同时保留含小数的值不变,避免逐行判断,兼顾性能与类型安全。
在 Pandas 中,常通过 Series.map(lambda x: int(x) if x.is_integer() else x) 实现“条件整型转换”,但该方式在 Polars 中不可直接套用——Polars 强调向量化操作与静态 schema,不鼓励基于单个值的运行时类型决策。不过,我们仍可通过 向量化 UDF(map_batches) 安全、高效地实现相同语义。
核心思路是:对目标列尝试强制转为 Int64,再比对转换前后值是否完全一致(即所有原始浮点数均为整数)。若一致,则采用整型结果;否则保留原浮点列。
以下是完整实现:
import polars as pl
def maybe_cast_int(s: pl.Series) -> pl.Series:
"""安全转换浮点 Series 为 Int64:仅当所有值均为整数时才转换,否则保持原类型。"""
try:
# 尝试转为 Int64(会截断小数,需后续校验)
casted = s.cast(pl.Int64)
# 检查转换后是否与原值数学相等(自动广播比较)
if (casted == s).all():
return casted
else:
return s
except Exception:
# 如存在 NaN、无穷大等无法 cast 的值,直接返回原 Series
return s
# 构造示例数据
df = pl.DataFrame({
"date": ["2025-01-01", "2025-01-02"],
"a": [1.0, 2.0], # 全为整数浮点
"c": [1.0, 2.1], # 混合:1.0 可转,2.1 不可转
"d": [3.0, None], # 含 null(cast 会失败,被异常捕获)
})
# 方式一:就地更新指定列(推荐用于清洗流程)
df_clean = df.with_columns(
pl.col("a", "c", "d").map_batches(maybe_cast_int)
)
print(df_clean)
输出:
shape: (2, 4) ┌────────────┬─────┬─────┬──────┐ │ date ┆ a ┆ c ┆ d │ │ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ i64 ┆ f64 ┆ f64 │ ╞════════════╪═════╪═════╪══════╡ │ 2025-01-01 ┆ 1 ┆ 1.0 ┆ 3.0 │ │ 2025-01-02 ┆ 2 ┆ 2.1 ┆ null │ └────────────┴─────┴─────┴──────┘
✅ 列
a成功转为i64;
✅ 列c因含2.1保持f64;
✅ 列d含null,cast(pl.Int64)抛异常,回退至原f64类型。
你也可以选择非破坏性方式,新增转换列用于对比或调试:
df.select(
"a", "c",
pl.col("a").map_batches(maybe_cast_int).alias("a_int"),
pl.col("c").map_batches(maybe_cast_int).alias("c_int_or_float"),
)
注意事项与最佳实践:
- ❗ Schema 稳定性优先:Polars 推崇显式、确定的 schema。频繁依赖数据内容动态改类型可能影响下游逻辑(如 SQL 接口、Parquet 写入兼容性)。建议仅在 ETL 清洗阶段使用,生产 pipeline 中尽量提前定义好字段语义。
- ⚡
map_batches是向量化操作,性能远优于apply或map_elements,它作用于整个Series块而非单个元素。 - ? 对含
NaN、inf或超范围浮点数的列,cast(pl.Int64)会失败,因此函数中加入了try/except防御,确保健壮性。 - ? 若需批量处理多列且逻辑统一,可结合
select+map_batches或封装为with_columns(**{f"{col}_int": pl.col(col).map_batches(maybe_cast_int) for col in cols})。
总之,map_batches + 类型校验是 Polars 中实现“智能整型转换”的标准范式——既尊重其向量化哲学,又满足实际数据清洗需求。










