Bird
Raised Fist0
Pandasdata~5 mins

stack() and unstack() in Pandas

Choose your learning style10 modes available
Introduction

stack() and unstack() help change how data is arranged in tables. They make it easy to switch between wide and tall views of data.

You want to turn columns into rows to see data in a long list.
You want to turn rows into columns to compare data side by side.
You need to reshape data for charts or reports.
You want to clean up data after grouping or pivoting.
You want to prepare data for analysis by changing its shape.
Syntax
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.

Examples
Stacking a simple DataFrame turns columns into rows.
Pandas
import pandas as pd

data = {'A': {0: 1, 1: 2}, 'B': {0: 3, 1: 4}}
df = pd.DataFrame(data)

stacked = df.stack()
print(stacked)
Stacking on a specific column level moves that level to the row index.
Pandas
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)
Unstacking a row level moves it to columns.
Pandas
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)
Stacking an empty DataFrame returns an empty Series.
Pandas
import pandas as pd

# Empty DataFrame
empty_df = pd.DataFrame()
print(empty_df.stack())
Sample Program

This program shows how to stack columns into rows and then unstack rows back into columns using a DataFrame with multi-level columns.

Pandas
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)
OutputSuccess
Important Notes

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).

Summary

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

(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