This program creates an ordered category for shirt sizes, then sorts the DataFrame so sizes appear from small to large.
Pandas
import pandas as pd
# Create a list of shirt sizes
sizes = ['medium', 'small', 'large', 'medium', 'small']
# Define ordered categories
ordered_sizes = pd.Categorical(sizes, categories=['small', 'medium', 'large'], ordered=True)
# Create a DataFrame
df = pd.DataFrame({'Size': ordered_sizes})
# Sort the DataFrame by Size
sorted_df = df.sort_values('Size')
print(sorted_df)
OutputSuccess
Important Notes
If you don't set ordered=True, pandas treats categories as unordered and sorting won't work as expected.
You can compare ordered categories using operators like <, >, ==.
Summary
Ordered categories let you work with data that has a natural order.
Use pd.Categorical with ordered=True and specify the order.
This helps in sorting, comparing, and plotting categorical data correctly.
Practice
(1/5)
1. What does setting ordered=True do when creating a pandas categorical variable?
easy
A. It converts categories to numeric values automatically.
B. It sorts the categories alphabetically.
C. It defines a natural order for the categories, allowing comparisons.
D. It removes duplicate categories from the list.
Solution
Step 1: Understand the role of ordered categories
Ordered categories allow pandas to know the sequence of categories, so it can compare them meaningfully.
Step 2: Effect of ordered=True
Setting ordered=True tells pandas to treat the categories as having a specific order, enabling operations like greater than or less than.
Final Answer:
It defines a natural order for the categories, allowing comparisons. -> Option C
Quick Check:
ordered=True means categories have order [OK]
Hint: Ordered=True means categories can be compared by order [OK]
Common Mistakes:
Thinking it sorts categories automatically
Assuming it converts categories to numbers
Believing it removes duplicates
2. Which of the following is the correct way to create an ordered categorical variable in pandas with categories 'low', 'medium', 'high' in that order?
easy
A. pd.Categorical(['low', 'medium', 'high'], categories=['low', 'medium', 'high'], ordered=True)
B. pd.Categorical(['low', 'tiny', 'high'], categories=['low', 'medium', 'high'], ordered=True)
C. pd.Categorical(['low', 'medium', 'high'], ordered=True, categories=['low', 'medium', 'high'])
D. pd.Categorical(['low', 'medium', 'high'], ordered=False, categories=['low', 'medium', 'high'])
Solution
Step 1: Check parameter order and names
pd.Categorical takes data first, then categories, then ordered flag as keyword arguments.
Step 2: Identify correct syntax
pd.Categorical(['low', 'medium', 'high'], categories=['low', 'medium', 'high'], ordered=True) correctly passes data, categories list, and ordered=True in correct order and names.
Final Answer:
pd.Categorical(['low', 'medium', 'high'], categories=['low', 'medium', 'high'], ordered=True) -> Option A
Quick Check:
Correct syntax uses categories= and ordered=True [OK]
Hint: Use categories= first, then ordered=True keyword [OK]
A. Comparison operator '>' is not supported for categorical data.
B. The categories list is missing 'high', causing invalid comparison.
C. Ordered=True cannot be used with categories parameter.
D. The data list has duplicate values.
Solution
Step 1: Check categories vs data
Data contains 'high' but categories only include 'low' and 'medium'.
Step 2: Understand effect on comparison
'high' is not in categories, so comparison with 'medium' fails causing error.
Final Answer:
The categories list is missing 'high', causing invalid comparison. -> Option B
Quick Check:
Data must match categories exactly [OK]
Hint: Ensure all data values are in categories list [OK]
Common Mistakes:
Thinking ordered=True disallows categories
Believing '>' is unsupported for ordered categories
Ignoring missing categories in list
5. You have a DataFrame with a column 'size' containing values 'small', 'medium', 'large', and 'extra large'. You want to sort the DataFrame by 'size' in the natural order small < medium < large < extra large. Which code correctly achieves this?