Пропуски в таблице: обнаружение, 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 и распространение значений.
