Использование Apply на полярах

Я пытаюсь создать новый столбец, используя Apply on Polars.

Не могли бы вы мне помочь, пожалуйста? Спасибо!

Попробовал выполнить следующую операцию:

df = df.with_columns(
    pl.col("AH_PROC_REALIZADO")
    .apply(get_procedure_description)
    .alias("proced_descr")
)

И получаю ошибку:

AttributeError: 'Expr' object has no attribute 'apply'


Функция, которую я пытаюсь применить:

def get_procedure_description(cod):

    proceds = {
        '41612' : 'CIRURGIA ONCOLOGICA',
        '30401' : 'RADIOTERAPIA',
        '30402' : 'QUIMIOTERAPIA',
        '30408' : 'QUIMIOTERAPIA',

        '410010057' : 'MASTECTOMIA RADICAL C/ LINFADENECTOMIA',
        '410010065' : 'MASTECTOMIA SIMPLES',

        '410010111' : 'SETORECTOMIA / QUADRANTECTOMIA',
        '410010120' : 'SETORECTOMIA / QUADRANTECTOMIA C/ ESVAZIAMENTO GANGLIONAR',

        '416020216' : 'LINFADENECTOMIA AXILAR UNILATERAL EM ONCOLOGIA ',
        '416020240' : 'LINFADENECTOMIA SELETIVA GUIADA (LINFONODO SENTINELA) EM ONCOLOGIA',

        '303130067' : 'TRATAMENTO DE PACIENTE SOB CUIDADOS PROLONGADOS POR ENFERMIDADES ONCOLOGICAS'
    }

    for proced in proceds.keys():
        if cod[: len(proced)] == proced:
            return proceds[proced]
        
    return None
Почему в 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
0
52
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

pl.Expr.apply устарел в пользу pl.Expr.map_elements в версии Polars 0.19.0. Недавно pl.Expr.apply был удален в версии Polars 1.0.0.

Вы можете адаптировать свой код к новой версии следующим образом.

df.with_columns(
    pl.col("AH_PROC_REALIZADO")
    .map_elements(get_procedure_description, return_dtype=pl.String)
    .alias("proced_descr")
)

Спасибо, это сработало!!

mmbr 31.07.2024 21:47

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

В вашем случае я бы посоветовал посмотреть replace() или replace_strict().

Если вы хотите просто выполнить поиск по столбцу AH_PROC_REALIZADO, вы можете использовать простой replace_strict():

df = pl.DataFrame({
    "AH_PROC_REALIZADO": ["30408", "410010065", "410010111", "XXXX"]
})

┌───────────────────┐
│ AH_PROC_REALIZADO │
│ ---               │
│ str               │
╞═══════════════════╡
│ 30408             │
│ 410010065         │
│ 410010111         │
│ XXXX              │
└───────────────────┘

df.with_columns(
    pl.col("AH_PROC_REALIZADO")
    .replace_strict(proceds, default=None)
    .alias("proced_descr")
)

┌───────────────────┬────────────────────────────────┐
│ AH_PROC_REALIZADO ┆ proced_descr                   │
│ ---               ┆ ---                            │
│ str               ┆ str                            │
╞═══════════════════╪════════════════════════════════╡
│ 30408             ┆ QUIMIOTERAPIA                  │
│ 410010065         ┆ MASTECTOMIA SIMPLES            │
│ 410010111         ┆ SETORECTOMIA / QUADRANTECTOMIA │
│ XXXX              ┆ null                           │
└───────────────────┴────────────────────────────────┘

Проблема с вашим вариантом использования заключается в том, что, насколько я понимаю, вы хотите искать по префиксу строк в столбце AH_PROC_REALIZADO. В этом случае вы, вероятно, могли бы настроить решение следующим образом:

  • itertools.groupby() для преобразования proceds словаря в словарь словарей, где ключи высокого уровня представляют собой длину ключа.
  • replace_strict() для поиска описания продукта.
  • Coalesce() для объединения результатов в последний столбец.
from itertools import groupby

mappings = {k: dict(g) for k, g in groupby(proceds.items(), lambda x: len(x[0]))}

df = pl.DataFrame({
    "AH_PROC_REALIZADO": ["30408_____", "410010065_____", "410010111____", "XXXX"]
})

┌───────────────────┐
│ AH_PROC_REALIZADO │
│ ---               │
│ str               │
╞═══════════════════╡
│ 30408_____        │
│ 410010065_____    │
│ 410010111____     │
│ XXXX              │
└───────────────────┘

df.with_columns(
    pl.coalesce(
        pl.col("AH_PROC_REALIZADO").str.head(k).replace_strict(m, default=None) for k, m in mappings.items()
    )
    .alias("proced_descr")
)

┌───────────────────┬────────────────────────────────┐
│ AH_PROC_REALIZADO ┆ proced_descr                   │
│ ---               ┆ ---                            │
│ str               ┆ str                            │
╞═══════════════════╪════════════════════════════════╡
│ 30408_____        ┆ QUIMIOTERAPIA                  │
│ 410010065_____    ┆ MASTECTOMIA SIMPLES            │
│ 410010111____     ┆ SETORECTOMIA / QUADRANTECTOMIA │
│ XXXX              ┆ null                           │
└───────────────────┴────────────────────────────────┘

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