Код: Выделить всё
disease_codes = {
"malaria": {"under_5": "a", "over_5": "b"},
"PUD": "c",
"Asthma": "d",
}
# The callable to return the appropriate code
def return_code(row):
diagnosis = row["diagnosis"]
age = row["age"]
dx_return = disease_codes.get(diagnosis, "Undefined")
if type(dx_return) == dict:
if age >= 5:
return dx_return.get("over_5")
return dx_return.get("under_5")
return dx_return
df.with_columns(pl.struct(["diagnosis", "age"]).map_elements(return_code).alias("code"))
Этот метод намного медленнее, чем API собственных выражений. Используйте его только в том случае, если иначе вы не можете реализовать свою логику.
Я пытался найти способ добиться этого с помощью собственного API и подумал, что map_batches подошёл близко:
Код: Выделить всё
def return_code(diagnosis, age):
dx_return = disease_codes.get(diagnosis, "Undefined")
if type(dx_return) == dict:
if age >= 5:
return dx_return.get("over_5")
return dx_return.get("under_5")
return dx_return
df.with_columns(
(pl.struct(["diagnosis", "age"]).map_batches(
lambda x: return_code(x.struct.field("diagnosis"), x.struct.field("age"))
)).alias("code")
)
Код: Выделить всё
TypeError: cannot use `__getitem__` on Series of dtype Struct([Field('diagnosis', Utf8), Field('age', Int64)]) with argument 'diagnosis' of type 'str'
Ожидаемый результат, который я получаю при рабочем подходе, должен быть следующим:

Подробнее здесь: https://stackoverflow.com/questions/774 ... p-elements
Мобильная версия