How to Split a Pandas DataFrame Column into Multiple Columns Using Stack, Str.split, Unstack, and Join

Pandas DataFrame Split Column

=====================================

In this article, we will explore how to split a column in a Pandas DataFrame into multiple columns. We will provide an example of how to achieve this using the stack, str.split, unstack, and join functions.

Problem Statement


Given a column in a Pandas DataFrame containing strings with a delimiter, we need to split these strings into separate columns in the same DataFrame.

Example:

| column_name_1 |
| --- |
| a^b^c       |
| e^f^g       |
| h^i         |

column_name_2     | j   | k   | m   |
------------------|-----|-----|-----|

We need to split the strings in column_name_1 into separate columns, like this:

| column_name_1_1 | column_name_1_2 | column_name_1_3 | column_name_2_1 | column_name_2_2 |
| --- | --- | --- | --- | --- |
| a       | b         | c           | j             |             |
| e       | f         | g           | k             | l             |
| h       | i          |              | m             |              |

Solution


We will use the stack, str.split, unstack, and join functions to achieve this.

tmp = df.stack().str.split('^', expand=True).unstack(level=1).sort_index(level=1, axis=1)
tmp.columns = [f'{y}_{x+1}' for x, y in tmp.columns]
out = df.join(tmp).dropna(how='all', axis=1).fillna('')

Explanation


1. stack()

The stack() function converts a DataFrame into a Series with the index as the column names and the values as the row labels.

df.stack()

This will produce a Series like this:

column_name_1
a^b^c    j
e^f^g    k
h^i      m
dtype: object

2. str.split('^', expand=True)

The str.split() function splits the strings in a Series into separate columns.

df.stack().str.split('^', expand=True)

This will produce a DataFrame with the original index and two new columns:

 column_name_1     | column_name_2
------------------|-------------
a^b^c           | j
e^f^g           | k
h^i             | m

3. unstack(level=1)

The unstack() function converts the DataFrame back into a DataFrame with separate columns for each level of the index.

df.stack().str.split('^', expand=True).unstack(level=1)

This will produce a DataFrame like this:

column_name_1_1 | column_name_2_1
---------------|-------------
a             | j
b             |
e             | k
f             |
g             |
h             |
i             |
dtype: object

4. sort_index(level=1, axis=1)

The sort_index() function sorts the columns by their index values.

df.stack().str.split('^', expand=True).unstack(level=1).sort_index(level=1, axis=1)

This will produce a DataFrame like this:

column_name_1_1 | column_name_2_1
---------------|-------------
a             | j
b             |
e             | k
f             |
g             |
h             |
i             |
dtype: object

5. Assigning new column names

We assign new column names to the DataFrame using a list comprehension.

tmp.columns = [f'{y}_{x+1}' for x, y in tmp.columns]

This will produce a DataFrame like this:

column_name_1_1 | column_name_2_1
---------------|-------------
a             | j         1
b             |
e             | k         1
f             |
g             |
h             | m         1
i             |
dtype: object

6. Joining the DataFrames

We join the original DataFrame with the temporary DataFrame using the join() function.

out = df.join(tmp).dropna(how='all', axis=1).fillna('')

This will produce a DataFrame like this:

column_name_1_1 | column_name_2_1 | column_name_1_2 | column_name_1_3 | column_name_2_1 | column_name_2_2
---------------|-------------|--------------|--------------|-------------|-------------
a             | j           | a            | b            | j           |
b             |               | b            | c            |
e             | k           | e            | f            | k           |
g             | l           |
h             | m           |
i             |
dtype: object

Conclusion


In this article, we demonstrated how to split a column in a Pandas DataFrame into multiple columns using the stack, str.split, unstack, and join functions. We also explained each step of the process and provided examples to illustrate the usage.

This technique can be useful when working with DataFrames that contain strings with delimiters, and you need to split these strings into separate columns in a convenient format.


Last modified on 2024-03-29