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

Объект Series модуля pandas в Python

Series представляет один столбец DataFrame

Синтаксис:

import pandas

pandas.Series(data=None, index=None, dtype=None, name=None, copy=None)

Параметры:

  • data=None - данные, которые будет хранить Series. Если данные представляют собой словарь, то порядок аргументов сохраняется.
  • index=None - значения должны быть хешируемыми и иметь ту же длину, что и данные. Допускаются неуникальные значения индекса. По умолчанию будет RangeIndex(0, 1, 2, …, n), если не указано иное. Если данные data имеют формат словаря, а index=None, то в качестве индекса используются ключи данных. Если индекс не равен None, то результирующая серия переиндексируется со значениями индекса.
  • dtype=None - тип данных для выходных данных data. Если не указано, то будет выведено из данных.
  • name=None - имя, которое следует дать серии (хэшируемый объект).
  • copy=None - копирует входные данные. Влияет только на ввод Series или 1d numpy.ndarray().

    Создание серии из списка list с аргументом copy=False. Из-за типа входных данных серия имеет копию исходных данных, даже если copy=False, поэтому данные не изменяются.

    >>> import pandas as pd
    >>> r = [1, 2]
    >>> ser = pd.Series(r, copy=False)
    >>> ser.iloc[0] = 999
    >>> r
    # [1, 2]
    >>> ser
    # 0    999
    # 1      2
    # dtype: int64
    

    Создание серии из 1d |numpy.ndarray()| с аргументом copy=False. Из-за типа входных данных серия имеет представление об исходных данных, поэтому данные также изменяются.

    >>> import pandas as pd
    >>> import numpy as np
    >>> r = np.array([1, 2])
    >>> ser = pd.Series(r, copy=False)
    >>> ser.iloc[0] = 999
    >>> r
    # array([999,   2])
    >>> ser
    # 0    999
    # 1      2
    # dtype: int64
    

    Аргумент copy изменит поведение в pandas 3.0. Копирование при записи будет включено по умолчанию, а это означает, что все методы с аргументом copy будут использовать механизм отложенного копирования и игнорировать аргумент copy. Ключевой аргумент copy будет удален в будущей версии pandas. Можно уже сейчас получить будущее поведение и улучшения, включив копирование при записи pd.options.mode.copy_on_write = True

Описание:

Класс pandas.Series() представляет собой одномерный массив numpy.ndarray с метками осей (включая временные ряды),

Объект pandas.Series() способен хранить данные любого типа (целые числа, строки, числа с плавающей запятой, объекты Python и т. д.). Метки осей в совокупности называются индексом. Другими словами, Series представляет один столбец DataFrame.

>>> import pandas as pd
>>> import numpy as np
>>> d = {"A": ['one', 'two', 'three'], 
         "B": [1, 2, 3]}
>>> df = pd.DataFrame(d)
>>> df
#        A  B
# 0    one  1
# 1    two  2
# 2  three  3
>>> type(df['A'])
# <class 'pandas.core.series.Series'>

Метки не обязательно должны быть уникальными, но должны быть хэшируемого типа. Объект поддерживает индексацию как на основе целых чисел, так и на основе меток, а также предоставляет множество методов для выполнения операций с индексом. Статистические методы из ndarray были переопределены для автоматического исключения недостающих данных (в настоящее время представленных как NaN).

Операции между Series (+, -, /, *, **) выравнивают значения на основе связанных с ними значений индекса - они не обязательно должны быть одинаковой длины. Результатом индекса будет отсортированное объединение двух индексов.

Работа с объектом pandas.Series:

Основной метод создания серии - вызов:

import pandas as pd 
s = pd.Series(data, index=index)

Здесь данными data могут быть:

  • словарь Python
  • numpy.ndarray - объект массива numpy.
  • скалярное значение (например, 5)

Переданный индекс index - представляет собой список меток осей.

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

>>> import numpy as np
>>> import pandas as pd
>>> s = pd.Series(np.random.randn(5), index=["a", "b", "c", "d", "e"])
>>> s
# a    1.052072
# b   -1.257349
# c   -0.852210
# d    0.679299
# e    0.117546
# dtype: float64
>>> s.index
# Index(['a', 'b', 'c', 'd', 'e'], dtype='object')

Если индекс не передан, он будет создан со значениями [0, ..., len(data) - 1].

>>> pd.Series(np.random.randn(5))
# 0    0.796289
# 1   -0.265410
# 2    0.785592
# 3    0.469011
# 4    0.793770
# dtype: float64

Series можно создать из словарей dicts:

>>> d = {"b": 1, "a": 0, "c": 2}
>>> pd.Series(d)
# b    1
# a    0
# c    2
# dtype: int64

Если передается индекс, то будут извлечены значения данных, соответствующие меткам в индексе.

>>> pd.Series(d, index=["b", "c", "d", "a"])
# b    1.0
# c    2.0
# d    NaN
# a    0.0
# dtype: float64

NaN (не число) - это стандартный маркер отсутствующих данных, используемый в pandas.

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

>>> pd.Series(5.0, index=["a", "b", "c", "d", "e"])
# a    5.0
# b    5.0
# c    5.0
# d    5.0
# e    5.0
# dtype: float64

Серия Series похожа на numpy.ndarray

Серия работает очень похоже на numpy.ndarray и является допустимым аргументом для большинства функций NumPy. Tакие операции, как взятие среза, также будут работать в pandas.

>>> s = pd.Series(np.random.randn(5), index=["a", "b", "c", "d", "e"])
>>> s
# a    1.052072
# b   -1.257349
# c   -0.852210
# d    0.679299
# e    0.117546
# dtype: float64
>>> s.iloc[0]
# 1.052072206787679
>>> s.iloc[:3]
# a    1.052072
# b   -1.257349
# c   -0.852210
# dtype: float64
>>> s[s > s.median()]
# a    1.052072
# d    0.679299
# dtype: float64
>>> s.iloc[[4, 3, 1]]
# e    0.117546
# d    0.679299
# b   -1.257349
# dtype: float64
>>> np.exp(s)
# a    2.863579
# b    0.284407
# c    0.426471
# d    1.972494
# e    1.124734
# dtype: float64

Подобно массиву NumPy, серия pandas имеет один тип dtype.

>>> s.dtype
# dtype('float64')

Однако pandas и сторонние библиотеки расширяют систему типов NumPy в нескольких местах, и в этом случае dtype будет иметь ExtensionDtype.

Если нужен реальный массив, поддерживающий серию, то используйте Series.array. Доступ к массиву может быть полезен, когда нужно выполнить какую-то операцию без индекса (например, чтобы отключить автоматическое выравнивание).

>>> s.array
# <NumpyExtensionArray>
# [  1.052072206787679, -1.2573490352240955, -0.8522102308393754,
#   0.6792989764006874, 0.11754623819740194]
# Length: 5, dtype: float64

Хотя Series похож на numpy.ndarray, но если нужен настоящий ndarray, то необходимо использовать метод Series.to_numpy() (Внимание! Дорогостоящая операция).

>>> s.to_numpy()
# array([ 1.05207221, -1.25734904, -0.85221023,  0.67929898,  0.11754624])

Серия Series похожа на словарь Python

Series также похожа на словарь фиксированного размера, следовательно можно получать и устанавливать значения по метке индекса:

>>> s["a"]
# 1.052072206787679
>>> s["e"] = 12.0
>>> s
# a     1.052072
# b    -1.257349
# c    -0.852210
# d     0.679299
# e    12.000000
# dtype: float64
>>> "e" in s
# True
>>> "f" in s
# False

Если метка не содержится в индексе, возникает исключение. Используя метод Series.get(), отсутствующая метка вернет None или указанное значение по умолчанию:

>>> print(s.get("f"))
# None
>>> s.get("f", np.nan)
# nan

Доступ к значениям меток также можно получить как в случае с атрибутами.

>>> s.a
# 1.052072206787679

Векторизованные операции и выравнивание меток по сериям

При работе с необработанными массивами NumPy циклическое перебор значений обычно не требуется. То же самое справедливо и при работе с pandas.Series. Серии Series также можно передавать в большинство методов NumPy, ожидающих ndarray.

# сложение
>>> s + s
a     2.104144
b    -2.514698
c    -1.704420
d     1.358598
e    24.000000
dtype: float64
# умножение
>>> s * 2
a     2.104144
b    -2.514698
c    -1.704420
d     1.358598
e    24.000000
dtype: float64

# передача `Series` в `NumPy`
>>> np.exp(s)
a         2.863579
b         0.284407
c         0.426471
d         1.972494
e    162754.791419
dtype: float64

Выравнивание меток по сериям

Ключевое различие между Series и ndarray заключается в том, что операции между Series (+, -, /, *, **) автоматически выравнивают данные на основе метки - они не обязательно должны быть одинаковой длины. Таким образом, можно записывать вычисления, не обращая внимания на то, имеют ли соответствующие pandas.Series одинаковые метки.

>>> ss = s.iloc[1:] + s.iloc[:-1]
>>> ss
a         NaN
b   -2.514698
c   -1.704420
d    1.358598
e         NaN
dtype: float64

Результатом операции между невыровненными Series будет объединение задействованных индексов. Если метка не найдена ни в той, ни в другой Series, результат будет помечен как отсутствующий NaN. Возможность писать код без явного выравнивания данных дает огромную свободу и гибкость в интерактивном анализе и исследовании данных. Интегрированные функции выравнивания данных в структурах данных отличают pandas от большинства связанных инструментов для работы с помеченными данными.

Примечание: результат операций между по-разному индексированными объектами по умолчанию дает объединение индексов, чтобы избежать потери информации. Наличие индексной метки, несмотря на отсутствие данных, обычно является важной информацией в рамках вычислений. Конечно, есть возможность удалить метки с отсутствующими данными с помощью метода Series.dropna().

Атрибут имени Series.name

Series также имеет атрибут имени:

>>> s = pd.Series(np.random.randn(5), name="something")
>>> s
# 0   -1.628574
# 1    2.397435
# 2    0.589502
# 3   -1.031708
# 4   -0.334813
# Name: something, dtype: float64
>>> s.name
# 'something'

Во многих случаях имя серии может быть назначено автоматически, в частности, при выборе одного столбца из pandas.DataFrame этому имени будет присвоена метка столбца.

Можно переименовать серию с помощью метода Series.rename().

>>> s2 = s.rename("different")
>>> s2.name
# 'different'

Обратите внимание, что s и s2 относятся к разным объектам.


Атрибуты объекта Series

  • Series.index: возвращает индекс (метки осей) Series.

  • Series.array: возвращает расширенный массив данных ExtensionArray, который поддерживает этот Series.

  • Series.values: возвращает Series как numpy.ndarray или ndarray-подобный, в зависимости от типа dtype.

  • Series.dtype: возвращает объект dtype базовых данных.

  • Series.shape: возвращает кортеж с формой базовых данных.

  • Series.nbytes: возвращает количество байтов в базовых данных.

  • Series.ndim: возвращает количество измерений базовых данных по определению - 1.

  • Series.size: возвращает количество элементов в базовых данных.

  • Series.hasnans: возвращает True, если есть какие-либо пропущенные значения NaN

  • Series.empty: проверяет, является ли Series пустым.

  • Series.dtypes: возвращает объект dtype базовых данных

  • Series.name: возвращает название Series

  • Series.flags: получает свойства, связанные с этим объектом pandas. Доступные флаги: Flags.allows_duplicate_labels, принимает значение bool

  • Series.memory_usage([index, deep]): Возвращает данные об использовании памяти Series. Использование памяти может дополнительно включать индекс и элементы dtype: object.

    >>> s = pd.Series(range(3))
    >>> s.memory_usage()
    # 152
    

    Без учета индекса получаем размер остальных данных, который обязательно будет меньше:

    >>> s.memory_usage(index=False)
    # 24
    

    Объем памяти, занимаемый значениями типа dtype: object, по умолчанию игнорируется:

    >>> s = pd.Series(["a", "b"])
    >>> s.values
    # array(['a', 'b'], dtype=object)
    >>> s.memory_usage()
    # 144
    >>> s.memory_usage(deep=True)
    # 244