Функции cumsum() и cumcount() в pandas: накопительная сумма и нумерация строк

cumsum() строит накопительную (кумулятивную) сумму — running total нарастающим итогом. Рядом обычно идёт cumcount() у GroupBy — накопительный счётчик строк внутри группы, аналог ROW_NUMBER() в SQL. Обе функции критично зависят от порядка строк, поэтому перед вызовом данные сортируют.

Синтаксис

Series.cumsum(skipna=True) · DataFrame.groupby(...).cumcount(ascending=True)

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

Пример 1: Running total по датам

import pandas as pd

df = pd.DataFrame({
    'date': ['2026-01', '2026-02', '2026-03'],
    'amount': [100, 150, 210],
})
df['running'] = df['amount'].cumsum()

Результат:

   date  amount  running
2026-01     100      100
2026-02     150      250
2026-03     210      460

Пример 2: Накопительная сумма по группам

df = pd.DataFrame({
    'user_id': [1, 1, 2, 2],
    'amount': [100, 200, 50, 70],
})
df['cum'] = df.groupby('user_id')['amount'].cumsum()

Результат:

user_id  amount  cum
      1     100  100
      1     200  300
      2      50   50
      2      70  120

Пример 3: cumcount — номер визита в группе (аналог ROW_NUMBER)

df['visit_no'] = df.groupby('user_id').cumcount() + 1

Результат:

user_id  amount  visit_no
      1     100         1
      1     200         2
      2      50         1
      2      70         2
Порешать Python-задачи в тренажёре →

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

И cumsum, и cumcount зависят от порядка строк — без сортировки итог неверный. cumcount() нумерует с 0 (для аналога ROW_NUMBER добавь +1) и доступен только у GroupBy, не у Series. cumsum по умолчанию skipna=True: NaN не рушит сумму, но в своей позиции остаётся NaN.

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

Спрашивают про running total и нумерацию строк внутри группы; cumcount идёт в паре с groupby как аналог ROW_NUMBER, а cumsum — рядом с оконными функциями SQL (SUM() OVER ... ).

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

Чем cumsum отличается от cumcount?

cumsum — накопительная сумма значений столбца. cumcount — накопительный счётчик строк внутри группы (0-индексный), это метод только у GroupBy. cumcount игнорирует сами значения и считает лишь порядковый номер строки в группе.

cumcount — это аналог ROW_NUMBER в SQL?

Практически да. Но cumcount() нумерует с 0, поэтому для полного аналога ROW_NUMBER() OVER (PARTITION BY ...) добавь +1. Порядок нумерации задаётся предварительной сортировкой DataFrame по нужному ключу.

cumsum пропускает NaN?

По умолчанию skipna=True — NaN не ломает накопление, сумма продолжается со следующего значения. Но в самой позиции NaN в результате останется NaN. С skipna=False всё после первого NaN станет NaN.

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

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

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

Pandas groupby · Pandas: основы

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

groupby · merge · pivot_table · apply · value_counts · drop_duplicates

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