pandas explode(): развернуть списки из ячеек в строки

DataFrame.explode разворачивает списки внутри ячеек в отдельные строки, дублируя остальные значения строки. Аналитику это нужно, чтобы нормализовать «многозначные» поля — теги, товары в заказе, категории — в длинный формат для группировок и подсчётов. Нюанс: пустые списки и NaN дают одну строку с NaN, а не исчезают, а индекс при этом дублируется.

Синтаксис

df.explode(column, ignore_index=False)

Примеры использования

Пример 1: Развернуть список товаров заказа

import pandas as pd
df = pd.DataFrame({
    'order_id': [1, 2],
    'items': [['book','pen'], ['cup']]
})
df.explode('items')

Результат:

   order_id items
0         1  book
0         1   pen
1         2   cup

Пример 2: Сбросить дублирующийся индекс через ignore_index

df.explode('items', ignore_index=True)

Результат:

   order_id items
0         1  book
1         1   pen
2         2   cup

Пример 3: Несколько колонок сразу (pandas 1.3+)

df2 = pd.DataFrame({
    'order_id': [1],
    'items': [['book','pen']],
    'qty': [[1, 3]]
})
df2.explode(['items','qty'])

Результат:

   order_id items qty
0         1  book   1
0         1   pen   3
Порешать Python-задачи в тренажёре →

Типичная ошибка

explode дублирует исходный индекс, из-за чего он перестаёт быть уникальным — добавляйте ignore_index=True или reset_index. Пустые списки и NaN превращаются в строку с NaN. При развороте нескольких колонок списки в них должны быть одинаковой длины в каждой строке, иначе ValueError.

Где спрашивают на собеседовании

Всплывает в задачах на нормализацию «многозначных» полей (списки, теги), часто вместе со str.split и последующим groupby или value_counts.

FAQ: частые вопросы про explode

Что происходит с пустыми списками и NaN?

Пустой список [] и NaN превращаются в одну строку со значением NaN в целевой колонке — строки не пропадают. Если такие строки не нужны, отфильтруйте результат через dropna по этой колонке после explode.

Можно ли разворачивать несколько колонок сразу?

Да, с pandas 1.3+ передайте список: df.explode(['items','qty']). Но списки в этих колонках должны быть одинаковой длины в каждой строке, иначе метод бросит ValueError о несовпадении длин.

Как explode соотносится со str.split?

Часто перед explode делают str.split(',') чтобы получить списки из строки с разделителями, а затем разворачивают их в строки. Это типичный способ нормализовать поля-перечисления (теги, категории) в длинный формат для дальнейшей агрегации.

Задачи в тренажёре по теме

Вопросы с собеседований по теме

Смежные темы Python

Pandas: основы · Pandas groupby

Другие функции pandas

groupby · merge · pivot_table · apply · value_counts · drop_duplicates

Открыть Python-тренажёр (556 задач) →