Перейти к содержимому
Теория · NumPy и pandas · урок 8 из 12

Таблица DataFrame в pandas

В массиве numpy у всех элементов один тип, а у столбцов нет имён. Реальные данные устроены иначе: в одном столбце город, в другом возраст, и к столбцам удобнее обращаться по названию. Для таких данных есть библиотека pandas:

Python
import numpy as np
import pandas as pd

df = pd.DataFrame({
    "city": ["Kazan", "Omsk", "Kazan", None],
    "age": [25, 41, np.nan, 33],
    "salary": [90, 120, 75, 110],
})
print(df.shape)  # (4, 3)
print(df["age"].mean())  # 33.0
print(df[["city", "age"]].shape)  # (4, 2)

Таблица DataFrame — набор столбцов с именами, и у каждого столбца свой тип. Её удобно создавать из словаря: ключ — имя столбца, значение — список значений. Атрибут shape работает как у массива: четыре строки, три столбца.

Столбцы и строки

Имя в квадратных скобках возвращает один столбец — Series. У него есть те же методы, что у массива: mean, sum, сравнение с числом. Список имён, df[["city", "age"]], возвращает новую таблицу из этих столбцов.

Сравнение столбца с числом даёт булеву маску, а маска в квадратных скобках оставляет подходящие строки. Столбцы одной таблицы выровнены: df["age"] и df["salary"] описывают одних людей в одном порядке. Поэтому маска по одному столбцу отбирает строки всей таблицы:

Python
older = df[df["age"] > 30]
print(older["salary"].tolist())  # [120, 110]

Метод tolist превращает столбец в обычный список Python.

Пропуски

Пропуск (missing value) — ячейка без значения. В числовом столбце pandas записывает его как NaN, в текстовом может стоять None. Метод isna отмечает пропуски обоих видов значением True, а notna — наоборот, заполненные ячейки.

Python
print(df.isna().sum().tolist())  # [1, 1, 0]
known = df[df["age"].notna()]
print(known.shape)  # (3, 3)

У таблицы sum по умолчанию складывает вдоль каждого столбца. Поэтому df.isna().sum() даёт число пропусков в каждом столбце: по одному в city и age. Среднее 33.0 в первом примере посчитано без пропуска: mean, sum и другие подсчёты в pandas не учитывают пропуски. Пропуски считают до обучения модели: большинство моделей scikit-learn на NaN останавливаются с ошибкой ValueError.

Частая ошибка

Пропуски ищут сравнением с np.nan:

Python
missing = df["age"] == np.nan  # ✗
print(missing.sum())  # 0

Python не сообщает об ошибке, но пропусков найдено ноль. NaN не равен ничему, даже самому себе, поэтому сравнение даёт False в каждой строке. Пропуски находит только df["age"].isna().

Подпишись, чтобы пройти курс

Курс бесплатный. Войди через Telegram и подпишись на канал — откроются все уроки.

Войти другим способом