Используйте спецификатор формата для преобразования столбца float/int в фрейме данных Polars в строку

У меня есть этот код:

import polars as pl
df = pl.DataFrame({'size': [34.2399, 1232.22, -479.1]})
df.with_columns(pl.format('{:,.2f}', pl.col('size')))

Но это не удается:

ValueError - Traceback, line 3
      2 df = pl.DataFrame({'size': [34.2399, 1232.22, -479.1]})
----> 3 df.with_columns(pl.format('{:,.2f}', pl.col('size')))

File polars\functions\as_datatype.py:718, in format(f_string, *args)
    717     msg = "number of placeholders should equal the number of arguments"
--> 718     raise ValueError(msg)

ValueError: number of placeholders should equal the number of arguments

Как я могу отформатировать столбец float или int, используя спецификатор формата, например '{:,.2f}'?

Запрос функции по этому поводу, просто для справки: github.com/pola-rs/polars/issues/7133

jqurious 04.09.2024 22:59
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
1
52
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

pl.format распознает буквальный {}, в отличие от f-строк Python (если вы запустите df.with_columns(pl.format('{:,.2f}')), вы увидите, что {:,.2f} остается неизменным).

Таким образом, вы не можете использовать pl.format так, как хотите (как указано в комментарии к вопросу, это запрос функции).

Вместо этого вы можете использовать один из методов, описанных здесь.

Код pl.format, показывающий, как это работает: он просто разбивает строки на {} (f_string.split("{}")) и объединяет их обратно с выражениями между ними:

def format(f_string: str, *args: Expr | str) -> Expr:
    if f_string.count("{}") != len(args):
        msg = "number of placeholders should equal the number of arguments"
        raise ValueError(msg)

    exprs = []

    arguments = iter(args)
    for i, s in enumerate(f_string.split("{}")):
        if i > 0:
            e = wrap_expr(parse_into_expression(next(arguments)))
            exprs.append(e)

        if len(s) > 0:
            exprs.append(F.lit(s))

    return concat_str(exprs, separator = "")
Ответ принят как подходящий

Как отметил @mozway, строки общего формата как часть pl.format пока не поддерживаются. Соответствующий запрос функции уже содержит красивую полярную реализацию (наиболее распространенного) форматирования sprint в стиле C.

Если эффективность не является большой проблемой (например, при исследовательском анализе данных), вы можете просто использовать pl.Expr.map_elements и вернуться к простому решению на Python.

df.with_columns(
    pl.col("size").map_elements(lambda x: f"{x:,.2f}", return_dtype=pl.String)
)
shape: (3, 1)
┌──────────┐
│ size     │
│ ---      │
│ str      │
╞══════════╡
│ 34.24    │
│ 1,232.22 │
│ -479.10  │
└──────────┘

На данный момент я остановил свой выбор на этом, хотя и использовал слегка измененную версию: pl.col('size').map_elements('{:,.2f}'.format, return_dtype=pl.String).

Phil-ZXX 05.09.2024 10:08

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

Похожие вопросы

Как ВСТАВИТЬ в таблицу с помощью AUTO_INCREMENT?
Дилемма 100 заключенных: кодекс всегда приводит к провалу (все заключенные умирают)
Как устранить ошибку AttributeError: у модуля «Фиона» нет атрибута «Путь»?
Я работаю над тем, чтобы сделать бота Python, который будет нажимать кнопку в списке, который повторяется сам, используя селен
Какие замены регулярных выражений помогают при переписывании SQL-запросов MS Access как простых запросов TSQL? Как их можно зациклить с помощью Excel в качестве входных и выходных данных?
Сообщение об ошибке с использованием нескольких замен строк %s
Должны ли классы аутентификации и классы разрешений в представлениях Django REST Framework определяться с помощью списков или кортежей?
Есть ли сценарий, в котором `foo in list(bar)` нельзя заменить на `foo in bar`?
Выполняется ли простое задание в Python дважды?
Итерация (или нет?) параметров для matplotlib для построения функции в Python