Polars усекает десятичные дроби

Я пытаюсь усечь числа с плавающей запятой в моем 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)
    )
)
docs.pola.rs/user-guide/misc/styling/…
Michael Cao 01.07.2024 17:06

@MichaelCao Привет, таким образом округляются десятичные дроби, мне нужно их обрезать. Кроме того, мне нужно продолжать выполнять другие операции с кадром данных.

Simon 01.07.2024 17:10

Поскольку вы упомянули polars.Config.set_float_precision: это параметр конфигурации, который управляет только тем, как значения с плавающей запятой отображаются в фрейме данных. Базовые ценности остаются нетронутыми.

Hericks 02.07.2024 12:44
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
3
112
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете использовать интеграцию 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") )

ОП упомянул, что они не хотят округлять десятичные числа, а усекают их.

Hericks 24.07.2024 09:18

Хорошо. Мы можем преобразовать его в строку и извлечь до необходимого десятичного значения, а затем снова преобразовать его в число с плавающей запятой: pl.DataFrame(data).with_columns( pl.col("grade").cast(pl.Utf8).str.extract (r'^(\d+\.\d{2})').‌​cast(pl.Float64).ali‌​as("formatted_grade"‌​) )

Tapan Hazarika 24.07.2024 19:09

Другие вопросы по теме