Shift and lag operations help you compare data points in a sequence by moving values up or down. This is useful to see changes over time or between steps.
Shift and lag operations in Data Analysis Python
df['new_column'] = df['existing_column'].shift(n)
n is the number of positions to move. Positive n shifts down (lag), negative n shifts up (lead).
Missing values appear where data is shifted beyond the start or end.
df['lag_1'] = df['value'].shift(1)
df['lead_1'] = df['value'].shift(-1)
df['lag_2'] = df['value'].shift(2)
This code creates a table of sales over 5 days. It adds two new columns: one with the previous day's sales and one with the next day's sales, using shift operations.
import pandas as pd data = {'day': [1, 2, 3, 4, 5], 'sales': [100, 150, 130, 170, 160]} df = pd.DataFrame(data) df['previous_day_sales'] = df['sales'].shift(1) df['next_day_sales'] = df['sales'].shift(-1) print(df)
Shift does not change the order of rows, it only moves values within a column.
Missing values (NaN) appear where there is no data to fill after shifting.
You can use shift with any numeric or categorical column to compare rows.
Shift moves data up or down to compare rows in sequence.
Positive shift values create lag (previous rows), negative create lead (next rows).
Useful for time series and sequential data analysis.
Practice
shift(1) function do to a pandas DataFrame column?Solution
Step 1: Understand the shift function
Theshift(1)moves data down by one row, so each value is replaced by the previous row's value.Step 2: Identify lag vs lead
Positive shift values create lag (previous rows), soshift(1)creates lag by one row.Final Answer:
Moves the data down by one row, creating a lag of previous values -> Option AQuick Check:
shift(1) = lag by 1 row [OK]
- Confusing shift(1) with shift(-1)
- Thinking shift sorts data
- Assuming shift removes rows
'prev_value' that contains the previous row's value of column 'value' in pandas?Solution
Step 1: Recall pandas shift syntax
The correct syntax is to callshift()on the Series, likedf['value'].shift(1).Step 2: Check each option
df['prev_value'] = df['value'].shift(1) uses correct syntax. df['prev_value'] = df['value'].shift(-1) shifts in the wrong direction. df['prev_value'] = df.shift('value', 1) uses wrong method call. df['prev_value'] = shift(df['value'], 1) uses undefined function.Final Answer:
df['prev_value'] = df['value'].shift(1) -> Option DQuick Check:
Correct pandas shift syntax = df['prev_value'] = df['value'].shift(1) [OK]
Series.shift(n) to lag by n rows [OK]- Using negative shift for previous row
- Calling shift on DataFrame with wrong arguments
- Using undefined shift function
import pandas as pd
df = pd.DataFrame({'value': [10, 20, 30, 40]})
df['lag1'] = df['value'].shift(1)
df['lead1'] = df['value'].shift(-1)
print(df)What is the output?
Solution
Step 1: Calculate lag1 column
shift(1)moves values down by one, so first row is NaN, second row gets 10, third 20, fourth 30.Step 2: Calculate lead1 column
shift(-1)moves values up by one, so last row is NaN, third row gets 40, second 30, first 20.Final Answer:
value lag1 lead1 0 10 NaN 20.0 1 20 10.0 30.0 2 30 20.0 40.0 3 40 30.0 NaN -> Option CQuick Check:
Positive shift = lag, negative shift = lead [OK]
- Mixing lag and lead directions
- Forgetting NaN appears at shifted edges
- Confusing shift with sorting
df['prev'] = df.shift(1)['value']
Assuming
df is a pandas DataFrame with a column 'value'.Solution
Step 1: Understand what df.shift(1) does
df.shift(1)shifts the entire DataFrame down by one row, including all columns.Step 2: Check indexing and efficiency
Accessing ['value'] after shift works, but shifting entire DataFrame is inefficient if only one column is needed.Final Answer:
It shifts the entire DataFrame, not just the 'value' column, which is inefficient -> Option BQuick Check:
Shift on DataFrame shifts all columns [OK]
- Assuming shift returns Series when called on DataFrame
- Expecting syntax error from indexing
- Ignoring performance impact
df with a column 'sales'. You want to create a new column 'pct_change' that shows the percentage change from the previous day. Which code correctly uses shift to calculate this?Solution
Step 1: Understand percentage change formula
Percentage change = (current - previous) / previous * 100.Step 2: Apply shift to get previous value
df['sales'].shift(1)gives previous day's sales, so formula in df['pct_change'] = (df['sales'] - df['sales'].shift(1)) / df['sales'].shift(1) * 100 matches the formula.Step 3: Check other options
df['pct_change'] = (df['sales'].shift(1) - df['sales']) / df['sales'] * 100 reverses numerator and denominator incorrectly. df['pct_change'] = df['sales'].pct_change(1) uses built-in method but question asks for shift usage. df['pct_change'] = df['sales'].shift(-1) / df['sales'] * 100 uses lead instead of lag.Final Answer:
df['pct_change'] = (df['sales'] - df['sales'].shift(1)) / df['sales'].shift(1) * 100 -> Option AQuick Check:
Percentage change uses lag with shift(1) [OK]
- Using shift(-1) instead of shift(1)
- Reversing numerator and denominator
- Confusing built-in pct_change with manual shift
Ready to prove it?
Pass the test and this pattern moves unknown
