#Explode and regroup lists into rows in a pandas DataFrame
Setup
# Import libraries
import pandas as pd
# Create sample dataframe
df = pd.DataFrame(
{'zip_codes':["75002, 75005, 75007, 75019, 75020", "13000, 13001, 13005", "69001, 69003, 69004"]},
index=['Paris', 'Marseille', 'Lyon']
)
df| zip_codes | |
|---|---|
| Paris | 75002, 75005, 75007, 75019, 75020 |
| Marseille | 13000, 13001, 13005 |
| Lyon | 69001, 69003, 69004 |
Split values and expand into multiple rows
Use explode() to break down a list into multiple rows
# Split values on commas, and expand into multiple rows
df = (
df
.assign(zip_codes=lambda x: x['zip_codes'].str.split(','))
.explode('zip_codes')
)
df| zip_codes | |
|---|---|
| Paris | 75002 |
| Paris | 75005 |
| Paris | 75007 |
| Paris | 75019 |
| Paris | 75020 |
| Marseille | 13000 |
| Marseille | 13001 |
| Marseille | 13005 |
| Lyon | 69001 |
| Lyon | 69003 |
| Lyon | 69004 |
Regroup rows into a list
The inverse operation, regrouping multiple rows into a list, is achieved with a grouby() followed by agg(list).
# Regroup rows with the same index into a list
(
df
.groupby(df.index)
.agg(list)
)| zip_codes | |
|---|---|
| Lyon | [69001, 69003, 69004] |
| Marseille | [13000, 13001, 13005] |
| Paris | [75002, 75005, 75007, 75019, 75020] |