Polars более краткий способ заменить пустой список нулевымPython

Программы на Python
Anonymous
Polars более краткий способ заменить пустой список нулевым

Сообщение Anonymous »

Обзор вопроса
Я извлекаю данные из файла JSON, разделенного символом новой строки, применяя ряд преобразований. Одно из моих преобразований приводит к получению списка значений; в случаях, когда список пуст, я хочу, чтобы значение было нулевым, а не пустым списком. У меня есть код, который работает, но он кажется очень запутанным, и мне интересно, есть ли более простой способ сделать это, которого мне не хватает.
Подробнее
В каждом объекте JSON моего файла ndjson одним из элементов данных, которые меня интересуют, является массив вложенных объектов JSON телекоммуникаций.

Код: Выделить всё

{
... some data
"telecom":
[
{
"rank": 1,
"system": "phone",
"use": "work",
"value": "(123) 456-7890"
},
{
"rank": 2,
"system": "fax",
"use": "work",
"value": "(123) 456-7891"
}
]
... some other data
}
В рамках более крупной операции по извлечению данных я делаю:

Код: Выделить всё

df.select(
expr_first(),
expr_extract_phone(),
expr_others()
)
где expr_first(), expr_extract_phone() и expr_others() возвращают выражения Polars, которые выполняют некоторые преобразования в различных полях моего набора данных.
Для expr_extract_phone() я хочу получить список телефонных номеров от телекоммуникационных компаний как следующим образом:
  • для каждого вложенного объекта в массиве телекоммуникаций извлеките значение где system=="phone"
  • соберите все отдельные номера телефонов в списке
  • если список пуст, значение столбца должно быть нулевым, а не []
Мне удалось собрать кое-что, что работает:

Код: Выделить всё

def expr_extract_phone() -> pl.Expr:
return pl.col('telecom').list.eval(
pl.element().filter(pl.element().struct['system'] == 'phone').struct['value']
).list.unique().alias('phone_numbers').map_batches(lambda col:
pl.LazyFrame(col).select(
pl.when(pl.col('phone_numbers').list.len() > 0)\
.then(pl.col('phone_numbers'))
).collect().get_column('phone_numbers'),
return_dtype=pl.List(pl.String),
is_elementwise=True
)
Получение списка телефонных номеров кажется достаточно простым, однако вся часть Map_batches для замены пустого списка [] нулевым значением кажется очень запутанной. Есть ли более простой способ выполнить то, что я пытаюсь сделать?
Для строк этот пост SO, похоже, предоставляет хороший и понятный способ обработки, но я не могу найти эквивалент для списка.

Подробнее здесь: https://stackoverflow.com/questions/782 ... -with-null

Вернуться в «Python»