November 2, 2021

Детектируем пустые значения в датафрейме

Даже на завершающем этапе обработки данных часто сталкиваешься с проблемой наличия пропущенных значений. Они могли изначально быть не заполнены или появиться после применения определенных функций. На этот случай следует придумать, что делать с такими полями дальше. Рассмотрим универсальный инструментарий локализации "проблемных" значений.

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

Демонстрацию проведем на примере статистики поединков в рамках UFC (о способах ее получения рассказывал здесь), фрагмент которой имеет вид:

Допустим, я провел некую обработку признаков и поместил их в столбцы с суффиксом stat, а теперь хочу посмотреть, есть ли незаполненные значения в каком-либо столбце:

# show list of cols with at least 1 null
df_all.filter(regex='stat').isnull().any(axis=0)   

Сначала с помощью filter мы извлекаем все столбцы со словом stat в названии (подробнее здесь), потом isnull в каждой ячейке проставляет True/False, а затем метод any проходит по столбцам и если находит хотя бы одно True (т.е. пропущено) возвращает True, иначе - False.

Таким способом мы получаем список столбцов, нуждающихся в дополнительном исследовании. Дальше нам интересно посмотреть на строки с пустыми значениями:

# look at rows
df_all[df_all.filter(regex='stat').isnull().any(axis=1)].head(5)

Всего строк, где встречается хотя бы одно незаполненное значение - 42. В фрагменте выше меня привлек столбец "Sig.str", обозначающий количество значимых ударов. В силу важности показателя, можно предположить, если он не заполнен, то и другие важные для статистики поля тоже. Посмотрим, есть ли null-ы там, где указанный столбец не null:

df_all[(df_all.filter(regex='stat').isnull().any(axis=1)&(df_all['Sig. str'].notnull()))]

Их нет, вот я и решил в данном случае просто отфильтровать строки датафрейма с незаполненным значением "Sig.str":

df_all = df_all[df_all['Sig. str'].notnull()]

Напоследок напомню алгоритм поиска незаполненных значений (используем наиболее популярное имя переменной датафрейма обозначение - df):