Skip to learning content

DATA SCIENCE PYTHON PLAYGROUND

Data Foundations

← All challenges
IC09 · Products / sales · ~10–15 min

Where do categories overlap?

selection · relationships · counts

Category matrix

The question

Compare product categories across regions using available stock only.

df Category matrix

Your inputs

df

One row is an order line. Count lines regardless of their quantity.

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.
df · first 5 of 18 rows
order_idproductcategoryregionquantityunit_pricediscountin_stock
P001" Notebook "PaperEast23.50false
P002PENWritingWest51.2Nonetrue
P003" pencil"WritingEast30.80.5true
P004Note-bookPaperWest43.51true
P005" Notebook "PaperEast13.50true
View all 18 rows
df · complete input
order_idproductcategoryregionquantityunit_pricediscountin_stock
P001" Notebook "PaperEast23.50false
P002PENWritingWest51.2Nonetrue
P003" pencil"WritingEast30.80.5true
P004Note-bookPaperWest43.51true
P005" Notebook "PaperEast13.50true
P006PENWritingWest61.2Nonefalse
P007" pencil"WritingEast20.80.5true
P008Note-bookPaperWest83.51true
P009" Notebook "PaperEast23.50true
P010PENWritingWest51.2Nonetrue
P011" pencil"WritingEast30.80.5false
P012Note-bookPaperWest43.51true
P013" Notebook "PaperEast13.50true
P014PENWritingWest61.2Nonetrue
P015" pencil"WritingEast20.80.5true
P016Note-bookPaperWest83.51false
P017" Notebook "PaperEast23.50true
P018PENWritingWest51.2Nonetrue

The editable setup in Your Python creates these inputs when you run it.

Your task · Where do categories overlap?

Compare product categories across regions using available stock only.

cross_tabDataFramecategoriesnumber

Deliverables

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.

  1. Category by region countsOutputcross_tabDataFrame
    1. Create cross_tab with one row per category and one column per region for available (in_stock=True) records.
    2. Each cell is the number of records in that category and region, not the sum of quantity.
  2. Observed categoriesOutputcategoriesnumber
    1. Store the number of distinct categories in the in_stock=True rows in categories.

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

Is the requested cell a count of records or a sum of quantities?

Hint 2 — Tools

Boolean selection, pd.crosstab() for category-by-region counts, and nunique()

Revisit: Meet a DataFrame · Summarise groups · What values exist? · Combine conditions · Answer one numerical question

Hint 3 — Approach

Select available records, count category and region combinations, then count distinct available categories.

Explained solution

Add these lines below # Your work in the editor. The supplied input setup is already there.

available = df[df.in_stock]
cross_tab = pd.crosstab(available['category'], available['region'])
categories = available['category'].nunique()
cross_tab
View supplied setup

This code is already at the top of the editor.

import pandas as pd

# Supplied input: df (18 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),
        ('P017', ' Notebook ', 'Paper', 'East', 2, 3.5, 0, True),
        ('P018', 'PEN', 'Writing', 'West', 5, 1.2, None, True),
    ],
    columns=['order_id', 'product', 'category', 'region', 'quantity', 'unit_price', 'discount', 'in_stock'],
)

Why these steps exist

  • The cells count order lines, not quantities, so large orders do not weigh more than small ones.
  • The category and region labels identify each count; their alphabetical order does not affect the result.

Another valid approach

Grouping by category and region and then reshaping the counts is also valid. Keep the category and region labels attached to their values.

Tab: indent · Shift+Tab: outdent · Esc, then Tab: leave editor

Edit Python. Control or Command plus Enter runs it. Tab indents by four spaces. Shift plus Tab outdents. Press Escape, then Tab or Shift plus Tab to leave the editor.

Each run executes all editor code in a fresh Python session. Named outputs appear below when you run.

Python starts when you open a lesson.

Output

Run your code to see what Python returns.