Chapter 2 · Section 3 practice
Missing Data and Cleaning Decisions
Work from question 1 to 10. Edit your Python box, click Run Code, review the result, then click Submit attempt. Reference answers unlock after all ten attempts are submitted. This records completion, not correctness. Each box runs independently. Progress is saved in this browser.
1. Count missing sales
Warm-up. Print the number of missing Sales entries.
Write your answer, then run it.
2. Keep a recorded zero
Warm-up. Print Order labels for observed Sales equal to zero.
Write your answer, then run it.
3. Missing counts by column
Warm-up. Print the missing count for every column.
Write your answer, then run it.
4. Drop incomplete records
Build your skills. Drop rows with any missing entry and print retained Order labels.
Write your answer, then run it.
5. Check only Sales
Build your skills. Drop rows only when Sales is missing. Print retained Order labels.
Write your answer, then run it.
6. Mean denominator
Build your skills. Print the row count, observed Sales count, and Sales mean rounded to two decimals.
Write your answer, then run it.
7. Median fill in a copy
Build your skills. Copy df and fill missing Sales with its observed median. Print the filled list and show that df still has one missing Sale.
Write your answer, then run it.
8. Column deletion
Challenge. Drop columns containing any missing entry and print the remaining column names.
Write your answer, then run it.
9. Carry a valid fee forward
Challenge. Forward-fill these recorded fees and print the resulting list. Explain why the first entry stays missing.
Write your answer, then run it.
10. Observed values and a threshold
Challenge. Select only non-missing values <= 3 and print them as a list.
Write your answer, then run it.
Reference answers are locked until all 10 attempts are submitted.
1. Count missing sales
import pandas as pd
df = pd.DataFrame({"Order": ["A", "B", "C", "D"],
"Sales": [100, None, 0, 300],
"Rating": [4.0, 5.0, None, 3.0]})
print(df["Sales"].isna().sum())Expected output
1There is one unknown sales record.
2. Keep a recorded zero
import pandas as pd
df = pd.DataFrame({"Order": ["A", "B", "C", "D"],
"Sales": [100, None, 0, 300],
"Rating": [4.0, 5.0, None, 3.0]})
print(list(df.loc[df["Sales"].notna() & (df["Sales"] == 0), "Order"]))Expected output
['C']Recorded zero is available information.
3. Missing counts by column
import pandas as pd
df = pd.DataFrame({"Order": ["A", "B", "C", "D"],
"Sales": [100, None, 0, 300],
"Rating": [4.0, 5.0, None, 3.0]})
print(df.isna().sum())Expected output
Order 0
Sales 1
Rating 1
dtype: int64The Sales and Rating columns each have one missing entry.
4. Drop incomplete records
import pandas as pd
df = pd.DataFrame({"Order": ["A", "B", "C", "D"],
"Sales": [100, None, 0, 300],
"Rating": [4.0, 5.0, None, 3.0]})
print(list(df.dropna()["Order"]))Expected output
['A', 'D']Both Sales and Rating are required by this broad rule.
5. Check only Sales
import pandas as pd
df = pd.DataFrame({"Order": ["A", "B", "C", "D"],
"Sales": [100, None, 0, 300],
"Rating": [4.0, 5.0, None, 3.0]})
print(list(df.dropna(subset=["Sales"])["Order"]))Expected output
['A', 'C', 'D']An unknown rating does not remove an observed sales value.
6. Mean denominator
import pandas as pd
df = pd.DataFrame({"Order": ["A", "B", "C", "D"],
"Sales": [100, None, 0, 300],
"Rating": [4.0, 5.0, None, 3.0]})
print(len(df))
print(df["Sales"].count())
print(round(df["Sales"].mean(), 2))Expected output
4
3
133.33The observed mean uses three entries, not four.
7. Median fill in a copy
import pandas as pd
df = pd.DataFrame({"Order": ["A", "B", "C", "D"],
"Sales": [100, None, 0, 300],
"Rating": [4.0, 5.0, None, 3.0]})
clean = df.copy()
clean["Sales"] = clean["Sales"].fillna(clean["Sales"].median())
print(list(clean["Sales"]))
print(df["Sales"].isna().sum())Expected output
[100.0, 100.0, 0.0, 300.0]
1The median is 100, and an explicit copy preserves the input.
8. Column deletion
import pandas as pd
df = pd.DataFrame({"Order": ["A", "B", "C", "D"],
"Sales": [100, None, 0, 300],
"Rating": [4.0, 5.0, None, 3.0]})
print(list(df.dropna(axis=1).columns))Expected output
['Order']Deleting columns removes Sales and Rating information from all rows.
9. Carry a valid fee forward
import pandas as pd
fees = pd.Series([None, 10.0, None, 12.0])
print(list(fees.ffill()))Expected output
[nan, 10.0, 10.0, 12.0]There is no prior fee for the first observation.
10. Observed values and a threshold
import pandas as pd
x = pd.Series([2.0, None, 4.0, 3.0])
print(list(x[x.notna() & (x <= 3)]))Expected output
[2.0, 3.0]Explicit availability avoids interpreting unknown observations as small.