April 7, 2022

Обходим ошибки обработки пропущенных значений

Ряд операций с датафреймами при наличии отсутствующих значений могут привести к ошибке, так как не знают, как их обрабатывать. В Pandas предусмотрены встроенные средства обхода таких ситуаций. В демонстрационных целях будем использовать следующую таблицу:

df = pd.DataFrame([[0, 'Петрушкин' , 12], [1, 'Укропов', None ], [3, None, 24]],
                  columns=['id', 'fio', 'revenue'])
df

Если попытаться умножить значения последнего столбца на число, ошибки не будет, несмотря на NaN:

df['revenue'].map(lambda x: x*10)

В то же время, если попытаться посчитать длину элементов второго столбца, то ошибка возникнет:

df['fio'].map(lambda x: len(x))

Для этого случая в методе map предусмотрен параметр na_action, который можно установить в 'ignore' для обхода ошибки:

df['fio'].map(lambda x: len(x), na_action='ignore')

Такой же параметр присутствует в методе applymap, который работает на уровне всего датафрейма, а не только одного столбца:

df.applymap(lambda x: x*2, na_action='ignore')

Без использования этого параметра мы бы столкнулись с ошибкой.

Следует отметить, что для некоторых операций, которые мы осуществляем через универсальный метод map, существуют специализированные аналоги среди векторизованных строковых методов (вызываются через str), которые умеют работать с пропусками, например, len:

df['fio'].str.len()

Однако метод contains в их число не входит:

df[df['fio'].str.contains('Укропов')]

Спасает дело параметр na, который можно задать в False:

df[df['fio'].str.contains('Укропов', na = False)]

Таким образом, если получаете ошибку в результате обработки NaN значений, ищите спасительный параметр либо специализированные методы (как, например, векторизованные).