Пропуски (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 dtypeInt64.fillna(method="ffill")устарел — пишитеdf.ffill().
См. также
Примечание
Лицензия и источники
Техническое описание адаптировано из официальной документации Pandas (https://pandas.pydata.org/docs/), BSD-3-Clause License. Перевод на русский, примеры и пояснения — © AlashEd Wiki.