如何在Polars DataFrame中截断浮点数至指定小数位数?
Polars DataFrame浮点数截断至指定小数位的高效方法
你的当前方法通过字符串转换实现截断,确实存在步骤冗余且效率较低的问题,尤其是处理大数据集时。以下是几种更高效的方案:
1. 直接使用Polars内置的truncate函数
Polars提供了专门的truncate表达式,可直接对浮点数进行数值截断(区别于四舍五入),无需字符串转换:
import polars as pl data = { "name": ["Alice", "Bob", "Charlie"], "grade": [90.23456, 80.98765, 85.12345], } df = pl.DataFrame(data) # 截断至2位小数 result = df.with_columns( pl.col("grade").truncate(2).alias("truncated_grade") ) print(result)
输出:
shape: (3, 3) ┌─────────┬───────────┬────────────────┐ │ name ┆ grade ┆ truncated_grade│ │ --- ┆ --- ┆ --- │ │ str ┆ f64 ┆ f64 │ ╞═════════╪═══════════╪════════════════╡ │ Alice ┆ 90.23456 ┆ 90.23 │ │ Bob ┆ 80.98765 ┆ 80.98 │ │ Charlie ┆ 85.12345 ┆ 85.12 │ └─────────┴───────────┴────────────────┘
2. 手动数值计算实现截断
如果需要兼容旧版本Polars(truncate函数在0.17.0+引入),可以用数学方法实现:
# 截断至2位小数 decimal_places = 2 result = df.with_columns( ((pl.col("grade") * 10**decimal_places).floor() / 10**decimal_places).alias("truncated_grade") )
原理是将浮点数放大指定倍数后取整(floor向下取整,对应截断),再缩小回原比例。
关于polars.Config.set_float_precision的说明
这个配置仅控制浮点数的显示精度,不会修改DataFrame中存储的实际数值。如果只是为了打印输出时简化显示,而非修改数据本身,可以使用:
pl.Config.set_float_precision(2) print(df)
输出时grade列会显示为2位小数,但实际存储的还是原始的高精度数值。
内容的提问来源于stack exchange,提问作者Simon
相关产品推荐
相关产品推荐

