The split-apply-combine model helps you analyze data by breaking it into groups, doing calculations on each group, and then putting the results back together.
Split-apply-combine mental model in Pandas
df.groupby('column_name').agg({'column_to_aggregate': 'aggregation_function'})
groupby() splits the data into groups based on one or more columns.
agg() applies a function like sum, mean, or count to each group.
df.groupby('Category').sum()
df.groupby('Store')['Sales'].mean()
df.groupby(['Region', 'Product']).count()
This code creates a small table of sales and expenses for stores A, B, and C. It then groups the data by store and sums the sales and expenses for each store.
import pandas as pd data = {'Store': ['A', 'A', 'B', 'B', 'C', 'C'], 'Sales': [100, 150, 200, 250, 300, 350], 'Expenses': [80, 90, 120, 130, 160, 170]} df = pd.DataFrame(data) # Split by 'Store', then sum 'Sales' and 'Expenses' for each store result = df.groupby('Store').sum() print(result)
You can group by multiple columns by passing a list to groupby().
The aggregation function can be sum, mean, count, max, min, and others.
After grouping, you get a new DataFrame with the grouped keys as the index.
Split data into groups using groupby().
Apply calculations to each group with aggregation functions.
Combine the results into a new summarized DataFrame.
Practice
split-apply-combine mental model in pandas?Solution
Step 1: Understand the split step
The data is divided into groups based on some criteria usinggroupby().Step 2: Apply and combine steps
A function is applied to each group separately, then the results are combined into a new DataFrame.Final Answer:
Split data into groups, apply a function to each group, then combine results -> Option CQuick Check:
Split-apply-combine = Group, apply, combine [OK]
- Confusing split-apply-combine with sorting or filtering
- Thinking it only applies to plotting or saving files
- Mixing up the order of steps
df by the column 'Category' and calculate the mean of each group?Solution
Step 1: Identify correct groupby syntax
The correct way to group by a column isdf.groupby('Category').Step 2: Apply aggregation function
To get the mean of each group, use.mean()after grouping.Final Answer:
df.groupby('Category').mean() -> Option AQuick Check:
Groupby then mean = df.groupby('Category').mean() [OK]
- Calling mean before groupby
- Using apply(mean) without importing mean function
- Wrong method chaining order
df below:Category Value 0 A 5 1 B 3 2 A 7 3 B 2 4 C 4
What is the output of
df.groupby('Category').sum()?Solution
Step 1: Group data by 'Category'
Rows are grouped by 'Category': A, B, and C groups.Step 2: Sum values in each group
Sum values for A: 5+7=12, B: 3+2=5, C: 4.Final Answer:
Category as index with sums: A=12, B=5, C=4 -> Option DQuick Check:
Sum per group = A:12, B:5, C:4 [OK]
- Summing all values ignoring groups
- Expecting category as a column instead of index
- Thinking sum() causes error
result = df.groupby('Type').agg({'Score': 'mean', 'Age': 'max'})What is wrong if the code raises a KeyError?
Solution
Step 1: Understand KeyError cause
A KeyError usually means the column used for grouping does not exist in the DataFrame.Step 2: Check groupby argument and agg usage
Using a string in groupby and a dictionary in agg is correct syntax.Final Answer:
The DataFrame does not have a column named 'Type' -> Option BQuick Check:
KeyError means missing column [OK]
- Assuming aggregation functions are invalid
- Thinking groupby can't take string columns
- Misunderstanding agg() argument types
df with columns 'Team', 'Player', and 'Points'. You want to find the player with the highest points in each team. Which code correctly uses the split-apply-combine model to achieve this?Solution
Step 1: Understand the goal
We want the player with the highest points per team, not just the max points value.Step 2: Use groupby and apply to filter rows
Usingapplywith a lambda filters each group to rows where 'Points' equals the group's max.Step 3: Check other options
df.groupby('Team')['Points'].max() returns max points per team but not the player. df.groupby('Player')['Points'].sum() groups by player, not team. df.groupby('Team').mean()['Points'] returns mean points, not max player.Final Answer:
df.groupby('Team').apply(lambda g: g[g['Points'] == g['Points'].max()]) -> Option AQuick Check:
Use apply with filter to get max player per group [OK]
- Using max() alone returns only values, not rows
- Grouping by wrong column
- Using mean() instead of max()
Ready to prove it?
Pass the test and this pattern moves unknown
