Пропуски (NaN) в Pandas

Пропуски в данных — самое частое препятствие. В Pandas они представлены NaN (для чисел) или NA (для extension dtype). Их можно обнаружить методами isna/notna, удалить через dropna или заполнить через fillna/interpolate.

Когда использовать

  • Лог датчика «дёрнулся» — пропали несколько строк.

  • JSON-сообщение пришло без некоторых полей.

  • После merge появились пустые ячейки.

Пример 1. Обнаружение

import pandas as pd
import numpy as np

df = pd.DataFrame({"v": [1, np.nan, 3, np.nan]})
print(df.isna())
print("сумма пропусков:", df.isna().sum())

Output:

       v
0  False
1   True
2  False
3   True
сумма пропусков: v    2
dtype: int64

Пример 2. dropna

import pandas as pd
import numpy as np

df = pd.DataFrame({"a": [1, np.nan, 3], "b": [np.nan, 5, 6]})
print(df.dropna())

Output:

     a    b
2  3.0  6.0

По умолчанию удаляются строки с любым NaN. how="all" — только полностью пустые.

Пример 3. dropna по столбцу

import pandas as pd
import numpy as np

df = pd.DataFrame({"a": [1, np.nan, 3], "b": [4, 5, 6]})
print(df.dropna(subset=["a"]))

Output:

     a  b
0  1.0  4
2  3.0  6

Пример 4. fillna константой

import pandas as pd
import numpy as np

df = pd.DataFrame({"v": [1, np.nan, 3]})
print(df.fillna(0))

Output:

     v
0  1.0
1  0.0
2  3.0

Пример 5. Заполнение средним

import pandas as pd
import numpy as np

df = pd.DataFrame({"v": [1, np.nan, 3, np.nan, 5]})
df["v"] = df["v"].fillna(df["v"].mean())
print(df)

Output:

     v
0  1.0
1  3.0
2  3.0
3  3.0
4  5.0

Пример 6. ffill и bfill

import pandas as pd
import numpy as np

df = pd.DataFrame({"v": [1, np.nan, np.nan, 4]})
print(df.ffill())
print(df.bfill())

Output:

     v
0  1.0
1  1.0
2  1.0
3  4.0
     v
0  1.0
1  4.0
2  4.0
3  4.0

ffill — forward fill, bfill — backward fill. Часто применяются к временным рядам.

Пример 7. interpolate

import pandas as pd
import numpy as np

df = pd.DataFrame({"v": [1, np.nan, np.nan, 4]})
print(df.interpolate())

Output:

     v
0  1.0
1  2.0
2  3.0
3  4.0

Линейная интерполяция — хорошее «по умолчанию» для гладких физических величин.

Подводные камни

  • NaN != NaN — сравнение всегда даёт False. Используйте isna.

  • В int64 столбцах нет NaN — Pandas автоматически переведёт их в float64 или используйте extension dtype Int64.

  • fillna(method="ffill") устарел — пишите df.ffill().

См. также

Примечание

Лицензия и источники

Техническое описание адаптировано из официальной документации Pandas (https://pandas.pydata.org/docs/), BSD-3-Clause License. Перевод на русский, примеры и пояснения — © AlashEd Wiki.