📖 Scenario: You work in a small bookstore. You have sales data for different book genres. You want to find which genres have total sales above a certain number.
🎯 Goal: Build a program that uses pandas to group sales by genre and then filter groups where total sales are more than 100.
📋 What You'll Learn
Create a pandas DataFrame with given sales data
Set a sales threshold variable
Use groupby and filter() to keep only genres with total sales above threshold
Print the filtered DataFrame
💡 Why This Matters
🌍 Real World
Filtering grouped data is common in sales analysis, marketing, and finance to focus on important categories.
💼 Career
Data analysts and scientists often use group-level filtering to prepare data for reports and decision-making.
Progress0 / 4 steps
1
Create the sales DataFrame
Import pandas as pd. Create a DataFrame called sales_data with columns 'Genre' and 'Sales' using this exact data: 'Fiction' with 50, 'Non-Fiction' with 120, 'Fiction' with 70, 'Sci-Fi' with 90, and 'Non-Fiction' with 30.
Pandas
Hint
Use pd.DataFrame with a dictionary where keys are column names and values are lists of data.
2
Set the sales threshold
Create a variable called sales_threshold and set it to 100.
Pandas
Hint
Just assign the number 100 to the variable sales_threshold.
3
Filter genres with total sales above threshold
Use groupby('Genre') on sales_data and then use filter() with a lambda function that keeps groups where the sum of 'Sales' is greater than sales_threshold. Save the result in a variable called filtered_sales.
Pandas
Hint
Use groupby('Genre') then filter() with a lambda that sums 'Sales' and compares to sales_threshold.
4
Print the filtered sales data
Print the variable filtered_sales to see the genres with total sales above 100.
Pandas
Hint
Use print(filtered_sales) to show the filtered DataFrame.
Practice
(1/5)
1. What does the filter() function do when applied to a grouped pandas DataFrame?
easy
A. Sorts groups by their size
B. Filters rows inside each group individually
C. Keeps or removes entire groups based on a condition
D. Aggregates data by calculating group means
Solution
Step 1: Understand the purpose of filter() on groups
The filter() function is used on grouped data to keep or remove whole groups based on a condition applied to the group as a whole.
Step 2: Differentiate from row-level filtering
Unlike filtering rows inside groups, filter() returns entire groups only if the condition is True for that group.
Final Answer:
Keeps or removes entire groups based on a condition -> Option C
Quick Check:
Group-level filtering = Keeps/removes groups [OK]
Hint: Remember: filter() keeps or drops whole groups [OK]
Common Mistakes:
Thinking filter() filters rows inside groups
Confusing filter() with aggregation functions
Assuming filter() sorts groups
2. Which of the following is the correct syntax to filter groups in a pandas DataFrame df grouped by column 'Category' to keep groups with more than 3 rows?
easy
A. df.groupby('Category').filter(lambda x: len(x) > 3)
B. df.filter(groupby='Category', condition=lambda x: len(x) > 3)
C. df.groupby('Category').apply(filter(len(x) > 3))
D. df.filter(lambda x: x['Category'] > 3)
Solution
Step 1: Recall correct filter() syntax on grouped data
The correct syntax is to group by a column, then call filter() with a function that takes each group and returns True or False.
Step 2: Check each option
df.groupby('Category').filter(lambda x: len(x) > 3) correctly groups by 'Category' and filters groups with length > 3. Options A, B, and D use incorrect syntax or wrong method calls.
Final Answer:
df.groupby('Category').filter(lambda x: len(x) > 3) -> Option A
A. Because the lambda returns a Series, not a single True/False value
B. Because filter() cannot be used after groupby()
C. Because 'Value' column does not exist
D. Because filter() requires a list, not a lambda
Solution
Step 1: Understand filter() expects a boolean scalar per group
The function inside filter() must return a single True or False for the whole group.
Step 2: Analyze the lambda function
The lambda returns a Series of booleans (x['Value'] > 10) for each row, not a single boolean.
Final Answer:
Because the lambda returns a Series, not a single True/False value -> Option A
Quick Check:
filter() needs single True/False per group [OK]
Hint: Lambda must return one True/False per group, not Series [OK]
Common Mistakes:
Returning a Series instead of a scalar boolean
Thinking filter() works like row-level filter
Misunderstanding filter() usage after groupby
5. You have a sales DataFrame df with columns 'Store', 'Sales', and 'Month'. You want to keep only stores where the average monthly sales are above 5000. Which code correctly filters the DataFrame using filter()?
hard
A. df.filter(lambda x: x['Sales'].mean() > 5000, groupby='Store')
B. df.groupby('Store').filter(lambda x: x['Sales'] > 5000)
C. df.groupby('Store').apply(lambda x: x['Sales'].mean() > 5000)
D. df.groupby('Store').filter(lambda x: x['Sales'].mean() > 5000)
Solution
Step 1: Identify correct use of filter() with groupby
We must group by 'Store' and use filter() with a lambda returning True if the group's average sales > 5000.
Step 2: Check each option
df.groupby('Store').filter(lambda x: x['Sales'].mean() > 5000) correctly uses filter() with lambda x: x['Sales'].mean() > 5000. df.filter(lambda x: x['Sales'].mean() > 5000, groupby='Store') has wrong syntax, C uses apply which returns a Series, and D compares sales values directly, not the mean.
Final Answer:
df.groupby('Store').filter(lambda x: x['Sales'].mean() > 5000) -> Option D
Quick Check:
Use groupby + filter with mean condition [OK]
Hint: Filter groups by mean with groupby().filter(lambda x: x['col'].mean() > val) [OK]
Common Mistakes:
Using filter() without groupby()
Comparing individual sales instead of group mean
Using apply() instead of filter() for filtering groups
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.