Нашли ошибку?
базовыйpandas 3.0.6

Описательная статистика

Сумма, среднее, медиана, минимум и максимум по столбцам и строкам — и где находится максимум.

Нужно знать:Первичный осмотрВыбор столбцов

Содержание статьи

Коротко

  • sum, mean, median, min, max, std, count, quantile считаются по каждому столбцу (axis=0); axis=1 — по каждой строке.
  • Пропуски по умолчанию пропускаются (skipna=True), в отличие от NumPy.
  • idxmax() / idxmin() — метка строки с максимумом / минимумом (в NumPy argmax даёт позицию).
  • agg(["min", "max"]) — несколько статистик сразу.
  • std и var в pandas по умолчанию выборочные (ddof=1), в NumPy — ddof=0.
  • Текстовые столбцы в mean и подобных вызывают ошибку — выберите числовые или передайте numeric_only=True.

Синтаксис

df.sum(axis=0, skipna=True, numeric_only=False)   # так же mean, median, min, max, std
df.quantile(q=0.5)
df.idxmax(axis=0), df.idxmin(axis=0)
df.cumsum(axis=0)
df.agg(["min", "max", "mean"])

Параметры

ПараметрЧто делаетПо умолчанию
axis0 — по столбцам (результат для каждого столбца), 1 — по строкам0
skipnaпропускать NaNTrue
numeric_onlyтолько числовые столбцыFalse
ddofв std и var: знаменатель n − ddof1
qв quantile: уровень или список уровней от 0 до 10.5

Примеры

Данные для примеровиспользуются во всех примерах ниже
# продажи по месяцам: 3 магазина
sales = pd.DataFrame(
    {"jan": [120, 95, 140], "feb": [130, None, 150], "mar": [110, 105, 160]},
    index=["Омск", "Тула", "Сочи"],
)
По столбцам
sales.mean()                         # по каждому столбцу (axis=0); NaN пропускается
Вывод
jan    118.333333
feb    140.000000
mar    125.000000
dtype: float64
По строкам
sales.sum(axis=1)                    # по каждой строке
Вывод
Омск    360.0
Тула    200.0
Сочи    450.0
dtype: float64
Пропуски
print(sales["feb"].mean())
sales["feb"].mean(skipna=False)      # с пропуском результат — NaN
Вывод
140.0
np.float64(nan)
Несколько статистик
sales.agg(["min", "max", "median"])
Вывод
          jan    feb    mar
min      95.0  130.0  105.0
max     140.0  150.0  160.0
median  120.0  140.0  110.0
Где максимум
print(sales.idxmax())                # магазин с максимумом в каждом месяце
sales.idxmax(axis=1)                 # лучший месяц каждого магазина
Вывод
jan    Сочи
feb    Сочи
mar    Сочи
dtype: str
Омск    feb
Тула    mar
Сочи    mar
dtype: str
Квантили
sales["jan"].quantile([0.25, 0.5, 0.75])
Вывод
0.25    107.5
0.50    120.0
0.75    130.0
Name: jan, dtype: float64
Нарастающий итог
sales.cumsum(axis=1)                 # нарастающий итог по месяцам
Вывод
        jan    feb    mar
Омск  120.0  250.0  360.0
Тула   95.0    NaN  200.0
Сочи  140.0  290.0  450.0

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

std в pandas и NumPy

Разный ddof по умолчанию
print(sales["jan"].std())            # ddof=1 — выборочное
np.std(sales["jan"].to_numpy())      # NumPy: ddof=0
Вывод
22.546248764114473
np.float64(18.408935028645434)

Текстовые столбцы

Нечисловые столбцы не отбрасываются молча.

mean для таблицы с текстомошибка: TypeError
shops = sales.assign(manager=["Аня", "Борис", "Вика"])
shops.mean()
Ошибка
TypeError: Cannot perform reduction 'mean' with string dtype
numeric_only=True
shops = sales.assign(manager=["Аня", "Борис", "Вика"])
shops.mean(numeric_only=True)        # без numeric_only падает на тексте
Вывод
jan    118.333333
feb    140.000000
mar    125.000000
dtype: float64