Функция Series.diff() в pandas: разность соседних значений и приросты

Series.diff() возвращает разность между текущим и предыдущим значением: по сути s - s.shift(periods). Аналитику удобно превращать накопительные метрики в приросты по дням и месяцам или искать скачки в ряду. Первое значение всегда NaN — предыдущего элемента для него нет.

Синтаксис

Series.diff(periods=1)

Примеры использования

Пример 1: Прирост к предыдущему периоду

import pandas as pd

df = pd.DataFrame({
    'date': ['2026-01', '2026-02', '2026-03'],
    'total': [100, 150, 210],
})
df['delta'] = df['total'].diff()

Результат:

   date  total  delta
2026-01    100    NaN
2026-02    150   50.0
2026-03    210   60.0

Пример 2: Разность через 2 шага

df['delta2'] = df['total'].diff(2)

Результат:

total  delta2
  100     NaN
  150     NaN
  210   110.0

Пример 3: Diff внутри групп

df = pd.DataFrame({
    'user_id': [1, 1, 2, 2],
    'balance': [500, 650, 100, 90],
})
df['change'] = df.groupby('user_id')['balance'].diff()

Результат:

user_id  balance  change
      1      500     NaN
      1      650   150.0
      2      100     NaN
      2       90   -10.0
Порешать Python-задачи в тренажёре →

Типичная ошибка

Первая строка (или первые periods строк) — всегда NaN, а тип столбца становится float. Diff считается по текущему порядку строк, поэтому сначала сортируй по времени; по группам используй groupby(...).diff(), иначе на стыке групп получишь ложную разность.

Где спрашивают на собеседовании

Всплывает в задачах «переведи накопительный итог в дневные приросты» и при поиске аномалий в ряду; идёт в паре с shift (на нём построен), cumsum (обратная операция) и pct_change.

FAQ: частые вопросы про diff

Чем diff отличается от pct_change?

diff даёт абсолютную разность s - s.shift(), измеряется в тех же единицах (рублях, штуках). pct_change даёт относительный прирост (s / s.shift()) - 1 в долях. Для темпа роста берут pct_change, для дельты в единицах — diff.

Почему первая строка diff всегда NaN?

Для первой строки нет предыдущего значения, поэтому разность не определена. При diff(2) первые две строки будут NaN. Это ожидаемо — потом такие строки обычно фильтруют или заполняют.

Как считать diff по группам?

Используй df.groupby('user_id')['balance'].diff(). Без группировки разность посчитается через границу групп и первая строка каждого пользователя получит мусорное значение от предыдущей сущности.

Задачи в тренажёре по теме

Вопросы с собеседований по теме

Смежные темы Python

Pandas: временные ряды · Pandas: основы

Другие функции pandas

groupby · merge · pivot_table · apply · value_counts · drop_duplicates

Открыть Python-тренажёр (556 задач) →