Я пытаюсь усечь числа с плавающей запятой в моем DataFrame до желаемого количества десятичных знаков. Я обнаружил, что это можно сделать с помощью Pandas и NumPy здесь, но я также видел, что это возможно и с 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)
)
)
@MichaelCao Привет, таким образом округляются десятичные дроби, мне нужно их обрезать. Кроме того, мне нужно продолжать выполнять другие операции с кадром данных.
Поскольку вы упомянули polars.Config.set_float_precision
: это параметр конфигурации, который управляет только тем, как значения с плавающей запятой отображаются в фрейме данных. Базовые ценности остаются нетронутыми.
Вы можете использовать интеграцию Polars - Numpy следующим образом:
df = df.with_columns(truncated_grade=np.trunc(pl.col("grade") * 10) / 10)
Выход:
┌─────────┬──────────┬─────────────────┐
│ name ┆ grade ┆ truncated_grade │
│ --- ┆ --- ┆ --- │
│ str ┆ f64 ┆ f64 │
╞═════════╪══════════╪═════════════════╡
│ Alice ┆ 90.23456 ┆ 90.2 │
│ Bob ┆ 80.98765 ┆ 80.9 │
│ Charlie ┆ 85.12345 ┆ 85.1 │
└─────────┴──────────┴─────────────────┘
Полный код:
import numpy as np
import polars as pl
data = {
"name": ["Alice", "Bob", "Charlie"],
"grade": [90.23456, 80.98765, 85.12345],
}
df = pl.DataFrame(data)
df = df.with_columns(truncated_grade=np.trunc(pl.col("grade") * 10) / 10)
print(df)
используйте раунд:
import polars as pl
данные = {
"name": ["Alice", "Bob", "Charlie"],
"grade": [90.23456, 80.98765, 85.12345],
}
df = pl.DataFrame(data).with_columns( pl.col("grade").cast(pl.Utf8).str.extract(r'^(\d+.\d{2})').cast(pl .Float64).alias("formatted_grade") )
ОП упомянул, что они не хотят округлять десятичные числа, а усекают их.
Хорошо. Мы можем преобразовать его в строку и извлечь до необходимого десятичного значения, а затем снова преобразовать его в число с плавающей запятой: pl.DataFrame(data).with_columns( pl.col("grade").cast(pl.Utf8).str.extract (r'^(\d+\.\d{2})').cast(pl.Float64).alias("formatted_grade") )