Я пытаюсь создать новый столбец, используя 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
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")
)
Если вы действительно хотите применить функцию 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
. В этом случае вы, вероятно, могли бы настроить решение следующим образом:
proceds
словаря в словарь словарей, где ключи высокого уровня представляют собой длину ключа.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 │
└───────────────────┴────────────────────────────────┘
Спасибо, это сработало!!