📖 Scenario: You work in a small bakery that tracks daily sales of different types of bread. The sales data is recorded in a table where each column is a bread type and each row is a day. You want to reshape this data to a long format to analyze sales more easily.
🎯 Goal: Learn how to use the pandas melt() function to unpivot a wide table into a long table with one column for bread type and one for sales.
📋 What You'll Learn
Create a pandas DataFrame with daily sales data for three bread types.
Define the columns to keep fixed during unpivoting.
Use melt() to transform the DataFrame from wide to long format.
Print the final melted DataFrame.
💡 Why This Matters
🌍 Real World
Unpivoting data is common when you want to convert wide tables into long tables for easier analysis and visualization.
💼 Career
Data analysts and scientists often reshape data using melt() to prepare it for charts, reports, or machine learning.
Progress0 / 4 steps
1
Create the sales DataFrame
Create a pandas DataFrame called sales_data with these exact columns and values: 'Day': ['Monday', 'Tuesday', 'Wednesday'] 'Sourdough': [10, 12, 9] 'Baguette': [5, 7, 6] 'Rye': [3, 4, 2]
Pandas
Hint
Use pd.DataFrame() with a dictionary where keys are column names and values are lists of data.
2
Define the id_vars for melting
Create a list called id_vars containing the column 'Day' to keep fixed during melting.
Pandas
Hint
The id_vars list tells melt() which columns to keep as they are.
3
Use melt() to unpivot the DataFrame
Use pd.melt() on sales_data with id_vars=id_vars, var_name='Bread', and value_name='Sales'. Save the result in a variable called melted_data.
Pandas
Hint
The melt() function turns columns into rows. Use var_name for the new column name of the old columns, and value_name for the values.
4
Print the melted DataFrame
Print the variable melted_data to see the unpivoted sales data.
Pandas
Hint
Use print(melted_data) to display the final table.
Practice
(1/5)
1. What does the pandas.melt() function primarily do to a DataFrame?
easy
A. Filters rows based on a condition.
B. Sorts the DataFrame rows based on column values.
C. Transforms wide format data into long format data by unpivoting columns.
D. Aggregates data by grouping columns.
Solution
Step 1: Understand the purpose of melt()
The melt() function is used to convert wide data (many columns) into long data (fewer columns, more rows).
Step 2: Identify the transformation type
This process is called unpivoting, where columns become rows.
Final Answer:
Transforms wide format data into long format data by unpivoting columns. -> Option C
Quick Check:
melt() = unpivot wide to long [OK]
Hint: melt() turns columns into rows to reshape data [OK]
Common Mistakes:
Confusing melt() with sorting or filtering functions
Thinking melt() aggregates data
Assuming melt() changes row order only
2. Which of the following is the correct syntax to unpivot columns 'A' and 'B' in DataFrame df using melt() while keeping column 'ID' fixed?
easy
A. pd.melt(df, id_vars=['ID'], value_vars=['A', 'B'])
B. pd.melt(df, value_vars=['ID'], id_vars=['A', 'B'])
C. df.melt(id_vars=['A', 'B'], value_vars=['ID'])
D. df.melt(value_vars=['ID'], id_vars=['A', 'B'])
Solution
Step 1: Identify correct parameter usage
id_vars are columns to keep fixed; value_vars are columns to unpivot. Here, 'ID' is fixed, 'A' and 'B' are unpivoted.
Step 2: Match syntax with parameters
pd.melt(df, id_vars=['ID'], value_vars=['A', 'B']) correctly uses pd.melt(df, id_vars=['ID'], value_vars=['A', 'B']). Other options swap or misuse parameters.
Final Answer:
pd.melt(df, id_vars=['ID'], value_vars=['A', 'B']) -> Option A
Quick Check:
id_vars = fixed columns, value_vars = columns to unpivot [OK]
B. DataFrame with columns: ID, Month, Sales and 4 rows unpivoted from Jan and Feb
C. DataFrame with columns: ID, Jan, Feb unchanged
D. Error due to missing parameters
Solution
Step 1: Understand melt() parameters
id_vars=['ID'] keeps 'ID' fixed. var_name='Month' renames the variable column. value_name='Sales' renames the value column.
Step 2: Predict output structure
Jan and Feb columns become rows under 'Month' with their values under 'Sales'. Result has 4 rows (2 IDs x 2 months).
Final Answer:
DataFrame with columns: ID, Month, Sales and 4 rows unpivoted from Jan and Feb -> Option B
Quick Check:
melt() output = long format with renamed columns [OK]
Hint: melt() creates rows for each value_vars entry per id_vars row [OK]
Common Mistakes:
Expecting original wide format output
Ignoring var_name and value_name renaming
Thinking melt() drops id_vars
4. Consider this code snippet:
df = pd.DataFrame({'ID':[1,2],'A':[10,20],'B':[30,40]})
result = pd.melt(df, id_vars=['A'], value_vars=['ID', 'B'])
What is the main issue with this code?
medium
A. The id_vars column 'A' should be a fixed identifier, but it is a value column here.
B. Syntax error due to wrong parameter names.
C. No issue; code runs correctly and melts as expected.
D. value_vars contains 'ID' which is usually an identifier and should be in id_vars.
Solution
Step 1: Analyze id_vars and value_vars roles
id_vars should be columns to keep fixed (usually identifiers). value_vars are columns to unpivot.
Step 2: Check column roles in code
'ID' is usually an identifier and should be in id_vars, but here it is in value_vars, which is unusual and likely a mistake.
Final Answer:
value_vars contains 'ID' which is usually an identifier and should be in id_vars. -> Option D
Quick Check:
Identifiers belong in id_vars, not value_vars [OK]
Hint: Keep identifiers in id_vars, not in value_vars [OK]
Common Mistakes:
Swapping id_vars and value_vars
Assuming melt() ignores column roles
Thinking code has syntax error
5. You have a DataFrame with columns: ['Date', 'Store', 'Product_A', 'Product_B']. You want to reshape it so each row shows Date, Store, Product (either 'Product_A' or 'Product_B'), and Sales (the value). Which melt() call achieves this?
hard
A. pd.melt(df, id_vars=['Date', 'Store'], var_name='Product', value_name='Sales')
B. pd.melt(df, id_vars=['Product_A', 'Product_B'], var_name='Product', value_name='Sales')
C. pd.melt(df, value_vars=['Date', 'Store'], var_name='Product', value_name='Sales')
D. pd.melt(df, id_vars=['Date'], value_vars=['Store', 'Product_A', 'Product_B'])
Solution
Step 1: Identify fixed and unpivot columns
'Date' and 'Store' are identifiers to keep fixed (id_vars). 'Product_A' and 'Product_B' are value columns to unpivot.
Step 2: Use melt() with correct parameters
Use id_vars=['Date', 'Store'], var_name='Product' to name the unpivoted column, and value_name='Sales' for values.
Final Answer:
pd.melt(df, id_vars=['Date', 'Store'], var_name='Product', value_name='Sales') -> Option A