Обработка None значений в преобразовании в NumPy Recarray

Есть ли изящный способ обработки значений None при преобразовании списка кортежей в пустой массив с использованием одного вызова np.rec.fromrecords? Предполагая, что я знаю, что я хочу, чтобы отсутствующее значение было (например, -1 для целых чисел), как мне поймать и обработать приведенный ниже придуманный пример:

import numpy as np
a = [('Bob', 40, 3.14), ('Sue', 38, 6.28), ('Jim', None, 9.42)]
dtype = [('NAME', 'S10'), ('AGE', np.int32), ('SCORE', np.float64)]
try:
    b = np.rec.fromrecords(a, dtype=dtype)
except TypeError:
    # Convert None to 0 for AGE field here instead of raising the error
    raise TypeError('Caught a TypeError')

Я предполагаю, что я должен был бы сделать это для каждого поля, чтобы не пропустить истинные ошибки TypeErrors в другом месте в массиве. Есть ли способ изолировать, где (т.е. какие поля) в повторном массиве я хочу, чтобы это преобразование применялось. Мой реальный пример использования - преобразование записей pyodbc в массивные записи.

1 ответ

Решение

Возвратите -1 для значений столбца NULL, используя запрос к базе данных, что-то вроде этого:

SELECT COALESCE(ColumnName, -1) FROM Schema.Table;

Это вернет -1 для значений ColumnName, которые имеют значение NULL, в противном случае возвращается фактическое значение. Документация для COALESCE здесь при необходимости. Это позволяет вам указать значение замены NULL только для тех столбцов, которые вам нужны, и не будет маскировать TypeError исключения, которые вы должны заботиться.

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