pandas: типы столбцов и очистка по правилу

Пропуски в таблице: обнаружение, dropna, fillna и nullable dtype

Содержание курса

Удаление строк и столбцов с пропусками через dropna

Когда диагностика через isna().sum() показывает, что пропусков немного и строки с ними можно просто выбросить без потери смысла, на сцену выходит dropna.

По умолчанию df.dropna() удаляет любую строку, в которой есть хотя бы один пропуск. Для нашей таблицы это означает, что строка с индексом 1 — где пропущены age, salary и dept — исчезнет из результата:

import pandas as pd

df = pd.DataFrame({
    'age':    pd.array([25, None, 32], dtype='Int64'),
    'salary': [50000.0, float('nan'), 75000.0],
    'dept':   ['IT', None, 'HR']
})

clean = df.dropna()
print(clean)
   age   salary dept
0   25  50000.0   IT
2   32  75000.0   HR

dropna возвращает новый DataFrame — исходный df при этом не меняется, и строка с индексом 1 в нём по-прежнему присутствует. Необратимой потерей данных это становится только если вы перезаписываете исходную переменную (df = df.dropna()) или теряете ссылку на оригинальный объект. Пока df жив, данные можно достать.

Параметр how

Если нужно удалять строку только тогда, когда в ней пустые абсолютно все поля, используется how='all':

df2 = pd.DataFrame({
    'age':    pd.array([25, None, None], dtype='Int64'),
    'salary': [50000.0, float('nan'), None],
    'dept':   ['IT', 'Finance', None]
})

print(df2.dropna(how='all'))
   age   salary     dept
0   25  50000.0       IT
1  <NA>      NaN  Finance

Строка с индексом 1 содержит частичные данные (dept есть), поэтому how='all' её сохраняет. Строка 2 полностью пустая — она исчезает.

Параметр subset

Часто имеет смысл смотреть на пропуски только в ключевых столбцах. Если пропуск в dept допустим, а пропуск в salary — нет, указываем subset:

print(df.dropna(subset=['salary']))
   age   salary dept
0   25  50000.0   IT
2   32  75000.0   HR

Здесь строки отфильтрованы только по столбцу salary. Если бы пропуск был только в dept, строка бы осталась.

Параметр axis=1

Если пропуски сосредоточены в целом столбце — например, признак вообще не заполнялся — удобнее выбросить столбец, а не строки:

df3 = pd.DataFrame({
    'age':    [25, 30, 32],
    'salary': [50000.0, float('nan'), 75000.0],
    'score':  [float('nan'), float('nan'), float('nan')]
})

print(df3.dropna(axis=1, how='all'))
   age   salary
0   25  50000.0
1   30      NaN
2   32  75000.0

Столбец score полностью пустой — он удаляется. salary с одним пропуском остаётся, потому что how='all' требует, чтобы все значения в столбце были пропущены.

dropna — это инструмент для ситуаций, когда строка или столбец с пропуском не несёт полезной информации. Если данные можно восстановить или заменить осмысленным значением, следующий шаг — fillna и распространение значений.