Сообщить об ошибке.

Метод .explode() объектов Series/DataFrame в pandas

Преобразует каждый элемент списка в строку, повторяя значения индекса

Содержание:


Обзор метода .explode() объектов Series/DataFrame

Для столбца DataFrame со значениями в виде последовательности, метод DataFrame.explode() преобразует каждое значение этой последовательности в отдельную строку. Результирующий Index будет продублирован в соответствии с меткой индекса из исходной строки:

>>> import pandas as pd
>>> keys = ["panda1", "panda2", "panda3"]
>>> values = [["eats", "shoots"], ["shoots", "leaves"], ["eats", "leaves"]]
>>> df = pd.DataFrame({"keys": keys, "values": values})
>>> df
#      keys            values
# 0  panda1    [eats, shoots]
# 1  panda2  [shoots, leaves]
# 2  panda3    [eats, leaves]

>>> df["values"].explode()
# 0      eats
# 0    shoots
# 1    shoots
# 1    leaves
# 2      eats
# 2    leaves
# Name: values, dtype: object

По сути, здесь используется Series.explode(), т.к. один столбец DataFrame - это серия Series:

>>> df["values"]
# 0      [eats, shoots]
# 1    [shoots, leaves]
# 2      [eats, leaves]
# Name: values, dtype: object

>>> type(df["values"])
# <class 'pandas.core.series.Series'>

Метод DataFrame.explode() может разносить столбец в DataFrame.

>>> df.explode("values")
#      keys  values
# 0  panda1    eats
# 0  panda1  shoots
# 1  panda2  shoots
# 1  panda2  leaves
# 2  panda3    eats
# 2  panda3  leaves

Метод Series.explode() заменит пустые списки отсутствующими значениями и сохранит скалярные значения.

>>> s = pd.Series([[1, 2, 3], "foo", [], ["a", "b"]])
>>> s
# 0    [1, 2, 3]
# 1          foo
# 2           []
# 3       [a, b]
# dtype: object

>>> s.explode()
# 0      1
# 0      2
# 0      3
# 1    foo
# 2    NaN
# 3      a
# 3      b
# dtype: object

Строка, разделенная запятой, может быть преобразована на список с отдельными значениями, а затем преобразована в новую строку.

>>> df = pd.DataFrame([{"var1": "a,b,c", "var2": 1}, {"var1": "d,e,f", "var2": 2}])
>>> df
#     var1  var2
# 0  a,b,c     1
# 1  d,e,f     2

# преобразуем строку `var1` - в список строк 
>>> df = df.assign(var1=df.var1.str.split(","))
>>> df
#         var1  var2
# 0  [a, b, c]     1
# 1  [d, e, f]     2

>>> df.explode("var1")
  var1  var2
# 0    a     1
# 0    b     1
# 0    c     1
# 1    d     2
# 1    e     2
# 1    f     2

DataFrame.explode(column, ignore_index=False):

Метод DataFrame.explode() преобразует каждый элемент списка (значений DataFrame) в строку, повторяя значения индекса. Возвращает DataFrame c разнесенными элементами списка (значений DataFrame) по строкам подмножества column. Индекс для этих строк будет дублироваться.

Принимаемые аргументы:

  • column - индексная метка столбца/столбцов для обработки. Несколько столбцов указываются списком, где каждый элемент будет строкой str или tuple. все указанные столбцы их списка данных в одной строке DataFrame должны иметь одинаковую длину.
  • ignore_index=False - если True, результирующий индекс будет сброшен и проиндексирован заново как 0, 1, ..., n - 1.

Может поднимать исключение ValueError в случаях:

  • Если столбцы DataFrame не уникальны.
  • Если указанные столбцы для разнесения - это пустой список.
  • Если указанные столбцы для разнесения не имеют соответствующего количества элементов по строкам в DataFrame.

Примеры использования DataFrame.explode()

Эта процедура разбивает списки, включая списки, кортежи, множества, Series и numpy.ndarray. Результатом dtype строк подмножества будет dtype: object. Скаляры будут возвращены без изменений, а пустые списки приведут к созданию numpy.nan для этой строки. Кроме того, при разбивке множеств, порядок строк в выводе будет недетерминированным.

>>> import pandas as pd

df = pd.DataFrame({'A': [[0, 1, 2], 'foo', [], [3, 4]],
                   'B': 1,
                   'C': [['a', 'b', 'c'], np.nan, [], ['d', 'e']]})

>>> df
#            A  B          C
# 0  [0, 1, 2]  1  [a, b, c]
# 1        foo  1        NaN
# 2         []  1         []
# 3     [3, 4]  1     [d, e]

Разбиваем списки одного столбца 'A'.

>>> df.explode('A')
#      A  B          C
# 0    0  1  [a, b, c]
# 0    1  1  [a, b, c]
# 0    2  1  [a, b, c]
# 1  foo  1        NaN
# 2  NaN  1         []
# 3    3  1     [d, e]
# 3    4  1     [d, e]

Разбиваем списки нескольких столбцов.

>>> df.explode(list('AC'))
#      A  B    C
# 0    0  1    a
# 0    1  1    b
# 0    2  1    c
# 1  foo  1  NaN
# 2  NaN  1  NaN
# 3    3  1    d
# 3    4  1    e

Series.explode(ignore_index=False):

Метод Series.explode() преобразует каждый элемент списка (значения Series) в строку, повторяя значения индекса. Возвращает Series c разнесенными значениями списка по строкам. Индекс для этих строк будет дублироваться.

Если аргумент ignore_index=True, то результирующий индекс будет сброшен и проиндексирован заново как 0, 1, ..., n - 1.

Примеры использования Series.explode()

Series.explode() разбивает списки, включая списки, кортежи, множества, Series и numpy.ndarray. Результатом dtype строк подмножества будет dtype: object. Скаляры будут возвращены без изменений, а пустые списки приведут к созданию numpy.nan для этой строки. Кроме того, при разбивке множеств, порядок строк в выводе будет недетерминированным.

>>> import pandas as pd
>>> s = pd.Series([[1, 2, 3], 'foo', [], [3, 4]])
>>> s
# 0    [1, 2, 3]
# 1          foo
# 2           []
# 3       [3, 4]
# dtype: object

>>> s.explode()
# 0      1
# 0      2
# 0      3
# 1    foo
# 2    NaN
# 3      3
# 3      4
# dtype: object