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
могут быть:
numpy.ndarray
- объект массива numpy
. Переданный индекс 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
похожа на словарь PythonSeries
также похожа на словарь фиксированного размера, следовательно можно получать и устанавливать значения по метке индекса:
>>> 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