The question
Prepare consistent product labels for a catalogue handoff.
df Clean labelsYour inputs
df
The only equivalent spellings are note-book and notebook. Other labels must retain their meaning.
Field meanings and units
order_id- Order or order-line identifier, as defined by this brief.
product- Recorded product label.
category- Product category.
region- Sales region.
quantity- Number of units.
unit_price- Dollars per unit.
discount- Discount in dollars for the whole order line.
in_stock- Whether the order line is marked available.
order_id | product | category | region | quantity | unit_price | discount | in_stock |
|---|---|---|---|---|---|---|---|
| P001 | " Notebook " | Paper | East | 2 | 3.5 | 0 | false |
| P002 | PEN | Writing | West | 5 | 1.2 | None | true |
| P003 | " pencil" | Writing | East | 3 | 0.8 | 0.5 | true |
| P004 | Note-book | Paper | West | 4 | 3.5 | 1 | true |
| P005 | " Notebook " | Paper | East | 1 | 3.5 | 0 | true |
View all 16 rows
order_id | product | category | region | quantity | unit_price | discount | in_stock |
|---|---|---|---|---|---|---|---|
| P001 | " Notebook " | Paper | East | 2 | 3.5 | 0 | false |
| P002 | PEN | Writing | West | 5 | 1.2 | None | true |
| P003 | " pencil" | Writing | East | 3 | 0.8 | 0.5 | true |
| P004 | Note-book | Paper | West | 4 | 3.5 | 1 | true |
| P005 | " Notebook " | Paper | East | 1 | 3.5 | 0 | true |
| P006 | PEN | Writing | West | 6 | 1.2 | None | false |
| P007 | " pencil" | Writing | East | 2 | 0.8 | 0.5 | true |
| P008 | Note-book | Paper | West | 8 | 3.5 | 1 | true |
| P009 | " Notebook " | Paper | East | 2 | 3.5 | 0 | true |
| P010 | PEN | Writing | West | 5 | 1.2 | None | true |
| P011 | " pencil" | Writing | East | 3 | 0.8 | 0.5 | false |
| P012 | Note-book | Paper | West | 4 | 3.5 | 1 | true |
| P013 | " Notebook " | Paper | East | 1 | 3.5 | 0 | true |
| P014 | PEN | Writing | West | 6 | 1.2 | None | true |
| P015 | " pencil" | Writing | East | 2 | 0.8 | 0.5 | true |
| P016 | Note-book | Paper | West | 8 | 3.5 | 1 | false |
The editable setup in Your Python creates these inputs when you run it.
Prepare consistent product labels for a catalogue handoff.
cleanDataFramelabelslistDeliverables
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.
- Standardised catalogueOutput
cleanDataFrame- Create
cleanas a separate copy. - Trim
product, lowercase it, and recode note-book to notebook. - Keep all other values and row order.
- Create
- Final labelsOutput
labelslist- Store each distinct cleaned
productlabel once in a list namedlabels.
- Store each distinct cleaned
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 differences are accidental formatting, and which labels represent different products?
Hint 2 — Tools
copy(), str.strip(), str.lower(), replace() and unique()
Revisit: Protect the original · Recode categories · Clean text · What values exist?
Hint 3 — Approach
Work on a copy, normalise formatting, apply the stated spelling equivalence, then inspect the remaining labels.
Explained solution
Add these lines below # Your work in the editor. The supplied input setup is already there.
clean = df.copy()
clean['product'] = (
clean['product'].str.strip().str.lower().replace({'note-book': 'notebook'})
)
labels = list(clean['product'].unique())
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(
[
('P001', ' Notebook ', 'Paper', 'East', 2, 3.5, 0, False),
('P002', 'PEN', 'Writing', 'West', 5, 1.2, None, True),
('P003', ' pencil', 'Writing', 'East', 3, 0.8, 0.5, True),
('P004', 'Note-book', 'Paper', 'West', 4, 3.5, 1, True),
('P005', ' Notebook ', 'Paper', 'East', 1, 3.5, 0, True),
('P006', 'PEN', 'Writing', 'West', 6, 1.2, None, False),
('P007', ' pencil', 'Writing', 'East', 2, 0.8, 0.5, True),
('P008', 'Note-book', 'Paper', 'West', 8, 3.5, 1, True),
('P009', ' Notebook ', 'Paper', 'East', 2, 3.5, 0, True),
('P010', 'PEN', 'Writing', 'West', 5, 1.2, None, True),
('P011', ' pencil', 'Writing', 'East', 3, 0.8, 0.5, False),
('P012', 'Note-book', 'Paper', 'West', 4, 3.5, 1, True),
('P013', ' Notebook ', 'Paper', 'East', 1, 3.5, 0, True),
('P014', 'PEN', 'Writing', 'West', 6, 1.2, None, True),
('P015', ' pencil', 'Writing', 'East', 2, 0.8, 0.5, True),
('P016', 'Note-book', 'Paper', 'West', 8, 3.5, 1, False),
],
columns=['order_id', 'product', 'category', 'region', 'quantity', 'unit_price', 'discount', 'in_stock'],
)Why these steps exist
- Whitespace and letter case are formatting differences; the explicit recode handles only the authorised spelling equivalence.
- The separate
cleantable preserves the original labels for comparison and investigation.
Another valid approach
Equivalent literal replacements are valid, but do not remove punctuation from unrelated labels.