The question
Remove repeated uploads while retaining legitimate repeat purchases.
df Deduplicated ordersYour inputs
df
order_id identifies a real purchase. Different IDs remain separate purchases even when other fields match.
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 |
| C003 | LATTE | Small | 4.5 | 0.5 | AM | 2026-04-02 |
| C007 | LATTE | Small | 4.5 | 0.5 | AM | 2026-04-04 |
| C016 | " Latte " | Small | 4.5 | 0 | AM | 2026-04-01 |
The editable setup in Your Python creates these inputs when you run it.
Remove repeated uploads while retaining legitimate repeat purchases.
cleanDataFrameremoved_countnumberDeliverables
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.
- Retained ordersOutput
cleanDataFrame- Create
cleankeeping the first occurrence of eachorder_id, in original order, with all columns. - Repeated IDs are confirmed export duplicates.
- Create
- Removed copiesOutput
removed_countnumber- Store the number of extra copies removed in
removed_count.
- Store the number of extra copies removed in
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
Do two similar purchases necessarily describe the same order?
Hint 2 — Tools
drop_duplicates(), copy() and len()
Revisit: Remove duplicates · Protect the original · Find duplicate rows
Hint 3 — Approach
Use the confirmed order identity, retain its first occurrence and count only the extra copies removed.
Explained solution
Add these lines below # Your work in the editor. The supplied input setup is already there.
clean = df.drop_duplicates(subset=['order_id'], keep='first').copy()
removed_count = len(df) - len(clean)
cleanView 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'),
('C003', 'LATTE', 'Small', 4.5, 0.5, 'AM', '2026-04-02'),
('C007', 'LATTE', 'Small', 4.5, 0.5, 'AM', '2026-04-04'),
('C016', ' Latte ', 'Small', 4.5, 0, 'AM', '2026-04-01'),
],
columns=['order_id', 'drink', 'size', 'price', 'tip', 'shift', 'date'],
)Why these steps exist
- Purchase identity is
order_id. Similar drinks, prices and dates can still describe separate legitimate purchases. - Keeping the first upload removes extra copies without counting an entire repeated group as lost.
Another valid approach
Keeping rows not flagged as later duplicate IDs is equivalent to removing those extra copies.