crosstab() for cross-tabulation in Pandas - Time & Space Complexity
We want to understand how the time to create a cross-tabulation table grows as the data size increases.
Specifically, how the pandas crosstab() function handles larger inputs.
Analyze the time complexity of the following code snippet.
import pandas as pd
# Sample data
colors = ['red', 'blue', 'green', 'red', 'blue']
sizes = ['S', 'M', 'L', 'M', 'S']
# Create cross-tabulation
result = pd.crosstab(colors, sizes)
print(result)
This code counts how many times each color appears with each size, making a table of counts.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Scanning through each pair of values in the two input arrays.
- How many times: Once for each row in the input data (n times).
As the number of rows grows, the function must check each row once to count occurrences.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 checks |
| 100 | About 100 checks |
| 1000 | About 1000 checks |
Pattern observation: The work grows directly with the number of rows, so doubling rows roughly doubles the work.
Time Complexity: O(n)
This means the time to create the cross-tabulation grows linearly with the number of rows in the input.
[X] Wrong: "Because the output is a table, the time must grow with the square of input size."
[OK] Correct: The function only scans each row once and updates counts, it does not compare every pair of rows, so it grows linearly, not quadratically.
Understanding how pandas functions like crosstab() scale helps you explain data processing efficiency clearly in interviews.
"What if we added a third variable to group by in crosstab? How would the time complexity change?"
Practice
pandas.crosstab() function primarily do?Solution
Step 1: Understand the purpose of crosstab()
Thecrosstab()function creates a table showing frequency counts of combinations of values from two or more columns.Step 2: Compare with other options
Sorting, calculating mean, and filtering are different operations not done bycrosstab().Final Answer:
Counts how often values from two columns appear together -> Option CQuick Check:
crosstab() = frequency count [OK]
- Confusing crosstab with sorting or filtering
- Thinking crosstab calculates averages
- Assuming crosstab modifies original data
df?Solution
Step 1: Recall correct crosstab syntax
The correct syntax ispd.crosstab(df['A'], df['B'])where you pass two series as arguments.Step 2: Identify incorrect options
pd.crosstab(df.A, df.B, axis=1) wrongly uses axis parameter; df.crosstab('A', 'B') tries to call crosstab as a DataFrame method which doesn't exist; pd.crosstab(df['A', 'B']) passes a tuple incorrectly.Final Answer:
pd.crosstab(df['A'], df['B']) -> Option BQuick Check:
pd.crosstab(series1, series2) = correct syntax [OK]
- Calling crosstab as a DataFrame method
- Passing multiple columns as a tuple incorrectly
- Using wrong parameters like axis
import pandas as pd
data = {'Gender': ['M', 'F', 'F', 'M', 'F'], 'Preference': ['Tea', 'Coffee', 'Tea', 'Coffee', 'Tea']}
df = pd.DataFrame(data)What is the output of
pd.crosstab(df['Gender'], df['Preference'])?Solution
Step 1: Count occurrences for each Gender and Preference
For 'F': Coffee appears once, Tea appears twice. For 'M': Coffee appears once, Tea appears once.Step 2: Construct the crosstab table
Rows are Gender (F, M), columns are Preference (Coffee, Tea), with counts filled accordingly.Final Answer:
Preference Coffee Tea Gender F 1 2 M 1 1 -> Option AQuick Check:
Count values by groups = Preference Coffee Tea Gender F 1 2 M 1 1 [OK]
- Mixing up row and column labels
- Counting values incorrectly
- Assuming missing pairs have counts > 0
import pandas as pd
data = {'A': ['x', 'y', 'x'], 'B': ['p', 'q', 'p']}
df = pd.DataFrame(data)
result = pd.crosstab(df['A'], df['B'], margins=True, margin_name='Total')
print(result)It raises an error. Why?
Solution
Step 1: Check parameter names for crosstab()
The correct parameter to name the totals row/column ismargins_name, notmargin_name.Step 2: Identify the cause of error
Usingmargin_namecauses a TypeError because it's an unexpected keyword argument.Final Answer:
The parameter name should be margins_name, not margin_name -> Option DQuick Check:
Correct parameter is margins_name [OK]
- Misspelling parameter names
- Thinking crosstab requires numeric columns
- Forgetting parentheses in print (Python 3)
df with columns 'City', 'Product', and 'Sales'. You want to create a crosstab showing total sales for each city-product pair. Which code correctly achieves this?Solution
Step 1: Understand crosstab with aggregation
To aggregate values like sales, usevalues=with the column andaggfunc=with the aggregation function.Step 2: Check each option
pd.crosstab(df['City'], df['Product'], values=df['Sales'], aggfunc='sum') correctly passes the sales column and sum function. pd.crosstab(df['City'], df['Product'], values='Sales', aggfunc='sum') passes a string instead of a series for values. pd.crosstab(df['City'], df['Product'], aggfunc='sum') misses values parameter. pd.crosstab(df['City'], df['Product'], values=df['Sales']) misses aggfunc, so it defaults to count.Final Answer:
pd.crosstab(df['City'], df['Product'], values=df['Sales'], aggfunc='sum') -> Option AQuick Check:
Use values= and aggfunc= for aggregation [OK]
- Passing column name as string instead of series
- Omitting aggfunc for aggregation
- Expecting crosstab to sum without values parameter
Ready to prove it?
Pass the test and this pattern moves unknown
