Я извлекаю данные из файла 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_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
)
Для строк этот пост SO, похоже, предоставляет хороший и понятный способ обработки, но я не могу найти эквивалент для списка.
Подробнее здесь: https://stackoverflow.com/questions/782 ... -with-null