我正在尝试将 DataFrame 中的浮点数截断为所需的小数位数。我发现这可以使用 Pandas 和 NumPy
here
来完成,但我也发现使用
polars.Config.set_float_precision
也可以。
下面是我当前的方法,但我认为我可能会采取额外的措施。
import polars as pl
data = {
"name": ["Alice", "Bob", "Charlie"],
"grade": [90.23456, 80.98765, 85.12345],
}
df = pl.DataFrame(data)
(
df
# Convert to string
.with_columns(
pl.col("grade").map_elements(
lambda x: f"{x:.5f}",
return_dtype=pl.String
).alias("formatted_grade")
)
# Slice to get desired decimals
.with_columns(
pl.col("formatted_grade").str.slice(0, length = 4)
)
# Convert back to Float
.with_columns(
pl.col("formatted_grade").cast(pl.Float64)
)
)
你对使用 Polars 截断浮点数的小数位数想得太多了。虽然你的方法有效,但 Polars 提供了一种更直接的方法来实现这一点,而无需转换为字符串。
你可以使用
round()
函数或
.apply()
与
round()
来实现。以下是如何操作的:
import polars as pl
data = {
"name": ["Alice", "Bob", "Charlie"],
"grade": [90.23456, 80.98765, 85.12345],
}
df = pl.DataFrame(data)
# 使用 round() 函数
df.with_columns(
pl.col("grade").round(2).alias("rounded_grade")
)
# 或者使用 .apply() 和 round()
df.with_columns(
pl.col("grade").apply(lambda x: round(x, 2)).alias("rounded_grade")
)
这两种方法都将“grade”列中的值四舍五入到小数点后两位。
让我们来分解一下为什么这种方法比你的初始方法更好:
- 简洁性: 它需要更少的步骤,使你的代码更易于阅读和理解。
- 效率: 在大型数据集上,直接处理数值类型通常比转换类型更快。
通常情况下,在 Polars 中,如果你正在寻找执行特定操作的方法,通常有一个简洁而高效的内置函数可以完成这项工作。在这种情况下,
round()
函数被证明是截断浮点数小数位数的完美解决方案。