Subscribe to updates

Join 1,000+ actuaries for high-impact insights every Tuesday, Thursday, and Sunday. No spam, ever.

© 2026, Sutra by Rohan Yashraj Gupta

rohanyashraj.com
sutra. code sutra
AboutContact

Back to code sutra Archive

Thursday, January 15, 2026

Efficient Conditional Cumulation with Pandas

The Challenge

Actuarial models often require calculating cumulative values (e.g., policy duration, claim count in a period) that reset based on specific events (e.g., policy renewal, claim payment). Using explicit Python loops for such conditional resets on large datasets is computationally expensive and slow.

The Sutra Snippet

python
import pandas as pd

# Sample data mimicking policy events with renewals
df = pd.DataFrame({
    'PolicyID': ['A', 'A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C'],
    'EventDate': pd.to_datetime([
        '2020-01-01', '2020-07-01', '2021-01-01', '2021-07-01',
        '2019-03-01', '2020-03-01', '2020-09-01',
        '2022-01-01', '2022-06-01', '2023-01-01'
    ]),
    'IsRenewalEvent': [True, False, True, False, True, True, False, True, False, True] # True marks a reset point
})

# Ensure data is sorted for correct cumulative calculation within each policy
df = df.sort_values(by=['PolicyID', 'EventDate']).reset_index(drop=True)

# Step 1: Create a 'renewal group' identifier.
# This increments each time 'IsRenewalEvent' is True within each PolicyID,
# effectively grouping rows belonging to the same policy term.
df['RenewalGroup'] = df.groupby('PolicyID')['IsRenewalEvent'].cumsum()

# Step 2: Calculate the desired cumulative counter (e.g., 'PolicyYearInTerm')
# within each unique (PolicyID, RenewalGroup) combination.
df['PolicyYearInTerm'] = df.groupby(['PolicyID', 'RenewalGroup']).cumcount() + 1

# Resulting DataFrame snippet:
#   PolicyID  EventDate  IsRenewalEvent  RenewalGroup  PolicyYearInTerm
# 0        A 2020-01-01            True             1                 1
# 1        A 2020-07-01           False             1                 2
# 2        A 2021-01-01            True             2                 1
# 3        A 2021-07-01           False             2                 2
# 4        B 2019-03-01            True             1                 1
# 5        B 2020-03-01            True             2                 1
# 6        B 2020-09-01           False             2                 2
# ...
PRO

Efficiency Gain

This vectorized Pandas approach leverages highly optimized C routines for `groupby()` and `cumsum()`, delivering significant performance improvements over explicit Python loops, especially on large actuarial datasets, by avoiding row-by-row iteration.

Explore all Archives