Bird
Raised Fist0
Pandasdata~10 mins

stack() and unstack() in Pandas - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - stack() and unstack()
Start with DataFrame
↓
Call stack()
↓
Stacked Series with MultiIndex
↓
Call unstack()
↓
Original or reshaped DataFrame
stack() turns columns into rows creating a MultiIndex Series; unstack() reverses this by turning row levels back into columns.
Execution Sample
Pandas
import pandas as pd

df = pd.DataFrame({
  'A': [1, 2],
  'B': [3, 4]
})
stacked = df.stack()
unstacked = stacked.unstack()
This code creates a DataFrame, stacks it to turn columns into rows, then unstacks it back to the original shape.
Execution Table
StepActionData StructureShape/IndexOutput Preview
1Create DataFrame dfDataFrame(2 rows, 2 columns) A B 0 1 3 1 2 4
2Call df.stack()Series with MultiIndex(4 rows)0 A 1 B 3 1 A 2 B 4
3Call stacked.unstack()DataFrame(2 rows, 2 columns) A B 0 1 3 1 2 4
4End--stack() and unstack() complete, DataFrame restored
💡 All steps executed; stack() converted columns to rows, unstack() reversed it.
Variable Tracker
VariableStartAfter Step 1After Step 2After Step 3Final
dfNoneDataFrame(2x2)DataFrame(2x2)DataFrame(2x2)DataFrame(2x2)
stackedNoneNoneSeries with MultiIndex(4)Series with MultiIndex(4)Series with MultiIndex(4)
unstackedNoneNoneNoneDataFrame(2x2)DataFrame(2x2)
Key Moments - 3 Insights
Why does stack() result in a Series with a MultiIndex instead of a DataFrame?
stack() compresses columns into a single row index level, creating a Series with a MultiIndex to keep track of original row and column labels, as shown in execution_table step 2.
What happens if you call unstack() on a Series without a MultiIndex?
unstack() requires a MultiIndex to pivot one level back to columns. Without it, unstack() will raise an error or not reshape properly, unlike the successful unstack in step 3.
Does unstack() always restore the original DataFrame shape?
If no data is lost or filtered, unstack() reverses stack() perfectly, restoring the original shape as in step 3. But if data is missing or filtered, the shape may differ.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution table at step 2. What is the shape of the stacked data?
A4 rows, single column Series with MultiIndex
B2 rows, 2 columns DataFrame
C4 rows, 2 columns DataFrame
D2 rows, single column Series
💡 Hint
Refer to the 'Shape/Index' and 'Data Structure' columns in step 2 of the execution table.
At which step does the data return to its original DataFrame shape?
AStep 1
BStep 2
CStep 3
DStep 4
💡 Hint
Check the 'Shape/Index' and 'Output Preview' columns for step 3 in the execution table.
If the original DataFrame had 3 columns instead of 2, how would the stacked Series length change at step 2?
AIt would have 3 rows
BIt would have 6 rows
CIt would remain 4 rows
DIt would have 9 rows
💡 Hint
Stacking multiplies rows by columns; see variable_tracker for how shape changes.
Concept Snapshot
stack(): Converts DataFrame columns into rows, creating a Series with MultiIndex.
unstack(): Reverses stack(), turning MultiIndex rows back into columns.
Use stack() to reshape wide data to long format.
Use unstack() to reshape long data back to wide.
Both preserve data labels via MultiIndex.
Common in data cleaning and reshaping tasks.
Full Transcript
This visual execution shows how pandas stack() and unstack() work. Starting with a DataFrame of 2 rows and 2 columns, stack() compresses columns into rows, creating a Series with a MultiIndex that tracks original row and column labels. Then unstack() reverses this operation, restoring the original DataFrame shape. The execution table traces each step with data structure type, shape, and output preview. Variable tracker shows how variables df, stacked, and unstacked change. Key moments clarify common confusions about MultiIndex and shape restoration. The quiz tests understanding of shapes and transformations. This helps beginners see exactly how stack and unstack reshape data step-by-step.

Practice

(1/5)
1. What does the stack() function do in pandas?
easy
A. It filters rows based on a condition.
B. It moves rows into columns, making the data wider.
C. It moves columns into rows, making the data longer.
D. It sorts the DataFrame by index.

Solution

  1. 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.
  2. Step 2: Compare with other options

    unstack() does the opposite by moving rows into columns. Sorting and filtering are unrelated to stack().
  3. Final Answer:

    It moves columns into rows, making the data longer. -> Option C
  4. Quick Check:

    stack() = columns to rows [OK]
Hint: Remember: stack makes data longer by moving columns down [OK]
Common Mistakes:
  • Confusing stack() with unstack()
  • Thinking stack() sorts data
  • Assuming stack() filters rows
2. Which of the following is the correct syntax to unstack a DataFrame named df?
easy
A. df.stack()
B. df.unstack()
C. df.unstacked()
D. df.stack(unstack=True)

Solution

  1. Step 1: Recall the method names

    The method to move rows into columns is unstack(), so df.unstack() is correct.
  2. Step 2: Check other options

    df.stack() stacks columns into rows. unstacked() does not exist. stack(unstack=True) is invalid syntax.
  3. Final Answer:

    df.unstack() -> Option B
  4. Quick Check:

    Unstack method is unstack() [OK]
Hint: Use df.unstack() to widen data by moving rows to columns [OK]
Common Mistakes:
  • Using stack() instead of unstack()
  • Calling a non-existent method unstacked()
  • Passing wrong arguments to stack()
3. Given the DataFrame:
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?
medium
A. A Series with index ['A', 'B'] and values [1, 2]
B. A DataFrame with columns 'x' and 'y' and rows 'A' and 'B'
C. A DataFrame with columns 'A' and 'B' and rows 'x' and 'y'
D. A Series with MultiIndex: ('x', 'A')=1, ('x', 'B')=3, ('y', 'A')=2, ('y', 'B')=4

Solution

  1. Step 1: Understand stacking on df

    Stack moves columns into rows, creating a Series with a MultiIndex combining the original index and column labels.
  2. 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.
  3. Final Answer:

    A Series with MultiIndex: ('x', 'A')=1, ('x', 'B')=3, ('y', 'A')=2, ('y', 'B')=4 -> Option D
  4. Quick Check:

    stack() output is MultiIndex Series [OK]
Hint: Stack creates MultiIndex Series combining rows and columns [OK]
Common Mistakes:
  • Expecting a DataFrame output instead of Series
  • Confusing index and columns after stacking
  • Ignoring MultiIndex structure
4. You run the code:
df = pd.DataFrame({
  'X': [10, 20],
  'Y': [30, 40]
}, index=['a', 'b'])
result = df.unstack(level=2)

What error will occur?
medium
A. KeyError: Level 2 not found
B. TypeError: unstack() takes no arguments
C. ValueError: Cannot unstack with duplicate entries
D. No error, returns unstacked DataFrame

Solution

  1. Step 1: Check the index levels of df

    df has a single index level ('a', 'b'), so level 2 does not exist.
  2. Step 2: Understand unstack(level=2) behavior

    Requesting level 2 causes a KeyError because that level is missing.
  3. Final Answer:

    KeyError: Level 2 not found -> Option A
  4. Quick Check:

    unstack(level) must match existing index levels [OK]
Hint: Check index levels before unstacking by level number [OK]
Common Mistakes:
  • Assuming unstack() accepts any level number
  • Expecting no error on invalid level
  • Confusing level number with label
5. You have a DataFrame with a MultiIndex on rows:
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?
hard
A. Use df.unstack(level=1) to move second index level to columns.
B. Use df.stack(level=1) to move second index level to columns.
C. Use df.unstack(level=0) to move second index level to columns.
D. Use df.stack() without arguments.

Solution

  1. Step 1: Identify the MultiIndex levels

    The DataFrame has two index levels: level 0 ('A', 'B') and level 1 (1, 2).
  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.
  3. Final Answer:

    Use df.unstack(level=1) to move second index level to columns. -> Option A
  4. Quick Check:

    unstack(level=1) moves second index level to columns [OK]
Hint: Unstack the desired index level number to widen data [OK]
Common Mistakes:
  • Using stack() instead of unstack()
  • Unstacking wrong level number
  • Ignoring MultiIndex structure
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard