The question
The morning café team wants to understand its drink mix.
df Category profileYour inputs
df
One row is one order. Drink labels are already standardised. Proportions are fractions, not percentages.
Field meanings and units
order_id- Order or order-line identifier, as defined by this brief.
drink- Recorded drink label.
size- Recorded serving size.
price- Price in dollars; unparseable text needs the stated policy.
tip- Tip in dollars.
shift- AM or PM service period.
date- Calendar date supplied as YYYY-MM-DD text unless the task states it is invalid.
order_id | drink | size | price | tip | shift | date |
|---|---|---|---|---|---|---|
| C001 | Latte | Small | 4.5 | 0 | AM | 2026-04-01 |
| C002 | Tea | Large | 2.8 | 1 | PM | 2026-04-01 |
| C003 | Latte | Small | 4.5 | 0.5 | AM | 2026-04-02 |
| C004 | Mocha | Large | 5.2 | None | AM | 2026-04-02 |
| C005 | Latte | Small | 4.5 | 0 | PM | 2026-04-03 |
View all 16 rows
order_id | drink | size | price | tip | shift | date |
|---|---|---|---|---|---|---|
| C001 | Latte | Small | 4.5 | 0 | AM | 2026-04-01 |
| C002 | Tea | Large | 2.8 | 1 | PM | 2026-04-01 |
| C003 | Latte | Small | 4.5 | 0.5 | AM | 2026-04-02 |
| C004 | Mocha | Large | 5.2 | None | AM | 2026-04-02 |
| C005 | Latte | Small | 4.5 | 0 | PM | 2026-04-03 |
| C006 | Tea | Large | 2.8 | 1 | AM | 2026-04-03 |
| C007 | Latte | Small | 4.5 | 0.5 | AM | 2026-04-04 |
| C008 | Mocha | Large | 5.2 | None | PM | 2026-04-04 |
| C009 | Latte | Small | 4.5 | 0 | AM | 2026-04-05 |
| C010 | Tea | Large | 2.8 | 1 | AM | 2026-04-05 |
| C011 | Latte | Small | 4.5 | 0.5 | PM | 2026-04-06 |
| C012 | Mocha | Large | 5.2 | None | AM | 2026-04-06 |
| C013 | Latte | Small | 4.5 | 0 | AM | 2026-04-07 |
| C014 | Tea | Large | 2.8 | 1 | PM | 2026-04-07 |
| C015 | Latte | Small | 4.5 | 0.5 | AM | 2026-04-08 |
| C016 | Mocha | Large | 5.2 | None | AM | 2026-04-08 |
The editable setup in Your Python creates these inputs when you run it.
The morning café team wants to understand its drink mix.
countsSeriesproportionsSeriesDeliverables
Make the outputs listed below. Use each name exactly as shown. Then choose Check answer.
Python name key
Teal outlines name table columns. Violet left rules name Python objects. Dotted rules mark syntax, functions and parameters. Use each name exactly as shown.
- Morning countsOutput
countsSeries- Store the number of AM orders for each
drinkincounts.
- Store the number of AM orders for each
- Morning proportionsOutput
proportionsSeries- Store each
drink’s share of AM orders inproportions, using the samedrinklabels ascounts. - The shares should sum to 1.
- Store each
Data policy Keep all supplied source tables unchanged. Work on separate outputs.
Help Hints & explained solution
Choose the amount of help you need. Opening one hint does not reveal the others.
Hint 1 — Think
Which orders belong in the denominator?
Hint 2 — Tools
Boolean selection, groupby(), agg(), value_counts() and arithmetic
Revisit: Filter rows · Count categories · Combine conditions · Answer one numerical question · Summarise groups
Hint 3 — Approach
Select AM orders and calculate counts and fractions using that same population.
Explained solution
Add these lines below # Your work in the editor. The supplied input setup is already there.
morning = df[df['shift'] == 'AM']
counts = morning['drink'].value_counts()
proportions = counts / counts.sum()
countsView supplied setup
This code is already at the top of the editor.
import pandas as pd
# Supplied input: df (16 rows)
df = pd.DataFrame(
[
('C001', 'Latte', 'Small', 4.5, 0, 'AM', '2026-04-01'),
('C002', 'Tea', 'Large', 2.8, 1, 'PM', '2026-04-01'),
('C003', 'Latte', 'Small', 4.5, 0.5, 'AM', '2026-04-02'),
('C004', 'Mocha', 'Large', 5.2, None, 'AM', '2026-04-02'),
('C005', 'Latte', 'Small', 4.5, 0, 'PM', '2026-04-03'),
('C006', 'Tea', 'Large', 2.8, 1, 'AM', '2026-04-03'),
('C007', 'Latte', 'Small', 4.5, 0.5, 'AM', '2026-04-04'),
('C008', 'Mocha', 'Large', 5.2, None, 'PM', '2026-04-04'),
('C009', 'Latte', 'Small', 4.5, 0, 'AM', '2026-04-05'),
('C010', 'Tea', 'Large', 2.8, 1, 'AM', '2026-04-05'),
('C011', 'Latte', 'Small', 4.5, 0.5, 'PM', '2026-04-06'),
('C012', 'Mocha', 'Large', 5.2, None, 'AM', '2026-04-06'),
('C013', 'Latte', 'Small', 4.5, 0, 'AM', '2026-04-07'),
('C014', 'Tea', 'Large', 2.8, 1, 'PM', '2026-04-07'),
('C015', 'Latte', 'Small', 4.5, 0.5, 'AM', '2026-04-08'),
('C016', 'Mocha', 'Large', 5.2, None, 'AM', '2026-04-08'),
],
columns=['order_id', 'drink', 'size', 'price', 'tip', 'shift', 'date'],
)Why these steps exist
- Counts and proportions use AM orders only; using all orders as the denominator would understate the morning mix.
- Each share divides that drink’s count by the total number of AM orders.
Another valid approach
Group counts and normalised value counts are equivalent when they use the same AM orders.