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
df['delta2'] = df['total'].diff(2)
Результат:
total delta2 100 NaN 150 NaN 210 110.0
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-задачи в тренажёре →
Всплывает в задачах «переведи накопительный итог в дневные приросты» и при поиске аномалий в ряду; идёт в паре с shift (на нём построен), cumsum (обратная операция) и pct_change.
diff даёт абсолютную разность s - s.shift(), измеряется в тех же единицах (рублях, штуках). pct_change даёт относительный прирост (s / s.shift()) - 1 в долях. Для темпа роста берут pct_change, для дельты в единицах — diff.
Для первой строки нет предыдущего значения, поэтому разность не определена. При diff(2) первые две строки будут NaN. Это ожидаемо — потом такие строки обычно фильтруют или заполняют.
Используй df.groupby('user_id')['balance'].diff(). Без группировки разность посчитается через границу групп и первая строка каждого пользователя получит мусорное значение от предыдущей сущности.
Pandas: временные ряды · Pandas: основы
groupby · merge · pivot_table · apply · value_counts · drop_duplicates
Открыть Python-тренажёр (556 задач) →