stack() and unstack() help change how data is arranged in tables. They make it easy to switch between wide and tall views of data.
stack() and unstack() in Pandas
DataFrame.stack(level=-1, dropna=True) DataFrame.unstack(level=-1, fill_value=None)
stack() moves the innermost column level to become the innermost row index.
unstack() moves the innermost row index level to become the innermost column.
import pandas as pd data = {'A': {0: 1, 1: 2}, 'B': {0: 3, 1: 4}} df = pd.DataFrame(data) stacked = df.stack() print(stacked)
import pandas as pd # DataFrame with MultiIndex columns data = {('A', 'x'): {0: 1, 1: 2}, ('A', 'y'): {0: 3, 1: 4}, ('B', 'x'): {0: 5, 1: 6}} df = pd.DataFrame(data) stacked = df.stack(level=1) print(stacked)
import pandas as pd # DataFrame with MultiIndex rows data = {0: {('a', 'x'): 1, ('a', 'y'): 2, ('b', 'x'): 3}} df = pd.DataFrame(data) unstacked = df.unstack(level=1) print(unstacked)
import pandas as pd # Empty DataFrame empty_df = pd.DataFrame() print(empty_df.stack())
This program shows how to stack columns into rows and then unstack rows back into columns using a DataFrame with multi-level columns.
import pandas as pd # Create a DataFrame with MultiIndex columns sales_data = {('Store', 'A'): {0: 100, 1: 150}, ('Store', 'B'): {0: 200, 1: 250}, ('Product', 'X'): {0: 10, 1: 15}, ('Product', 'Y'): {0: 20, 1: 25}} df = pd.DataFrame(sales_data) print("Original DataFrame:") print(df) # Stack the inner column level (level=1) to rows stacked_df = df.stack(level=1) print("\nDataFrame after stacking level 1 columns to rows:") print(stacked_df) # Unstack the last row index level to columns unstacked_df = stacked_df.unstack(level=1) print("\nDataFrame after unstacking the last row index level back to columns:") print(unstacked_df)
Time complexity: Stacking and unstacking usually take O(n) time where n is the number of elements.
Space complexity: They create new objects, so space is O(n) as well.
Common mistake: Forgetting that stack() reduces columns and increases row levels, while unstack() does the opposite.
Use stack() when you want to make data longer (more rows). Use unstack() when you want to make data wider (more columns).
stack() moves columns into rows, making data longer.
unstack() moves rows into columns, making data wider.
They help reshape data for easier analysis and visualization.
Practice
stack() function do in pandas?Solution
Step 1: Understand the purpose of
stack()stack()takes the columns of a DataFrame and stacks them into the row index, making the data longer.Step 2: Compare with other options
unstack()does the opposite by moving rows into columns. Sorting and filtering are unrelated tostack().Final Answer:
It moves columns into rows, making the data longer. -> Option CQuick Check:
stack()= columns to rows [OK]
- Confusing stack() with unstack()
- Thinking stack() sorts data
- Assuming stack() filters rows
df?Solution
Step 1: Recall the method names
The method to move rows into columns isunstack(), sodf.unstack()is correct.Step 2: Check other options
df.stack()stacks columns into rows.unstacked()does not exist.stack(unstack=True)is invalid syntax.Final Answer:
df.unstack() -> Option BQuick Check:
Unstack method isunstack()[OK]
- Using stack() instead of unstack()
- Calling a non-existent method unstacked()
- Passing wrong arguments to stack()
import pandas as pd
df = pd.DataFrame({
'A': [1, 2],
'B': [3, 4]
}, index=['x', 'y'])
stacked = df.stack()What is the output of
stacked?Solution
Step 1: Understand stacking on df
Stack moves columns into rows, creating a Series with a MultiIndex combining the original index and column labels.Step 2: Check the resulting Series
The index pairs are ('x', 'A')=1, ('x', 'B')=3, ('y', 'A')=2, ('y', 'B')=4, matching A Series with MultiIndex: ('x', 'A')=1, ('x', 'B')=3, ('y', 'A')=2, ('y', 'B')=4.Final Answer:
A Series with MultiIndex: ('x', 'A')=1, ('x', 'B')=3, ('y', 'A')=2, ('y', 'B')=4 -> Option DQuick Check:
stack() output is MultiIndex Series [OK]
- Expecting a DataFrame output instead of Series
- Confusing index and columns after stacking
- Ignoring MultiIndex structure
df = pd.DataFrame({
'X': [10, 20],
'Y': [30, 40]
}, index=['a', 'b'])
result = df.unstack(level=2)What error will occur?
Solution
Step 1: Check the index levels of df
df has a single index level ('a', 'b'), so level 2 does not exist.Step 2: Understand unstack(level=2) behavior
Requesting level 2 causes a KeyError because that level is missing.Final Answer:
KeyError: Level 2 not found -> Option AQuick Check:
unstack(level) must match existing index levels [OK]
- Assuming unstack() accepts any level number
- Expecting no error on invalid level
- Confusing level number with label
import pandas as pd
index = pd.MultiIndex.from_tuples([('A', 1), ('A', 2), ('B', 1)])
df = pd.DataFrame({'val': [10, 20, 30]}, index=index)
How can you reshape
df so that the second level of the index becomes columns?Solution
Step 1: Identify the MultiIndex levels
The DataFrame has two index levels: level 0 ('A', 'B') and level 1 (1, 2).Step 2: Use unstack(level=1) to move second level to columns
Unstacking level 1 moves that index level into columns, reshaping the data as required.Final Answer:
Use df.unstack(level=1) to move second index level to columns. -> Option AQuick Check:
unstack(level=1) moves second index level to columns [OK]
- Using stack() instead of unstack()
- Unstacking wrong level number
- Ignoring MultiIndex structure
Ready to prove it?
Pass the test and this pattern moves unknown
