DataFrame
На этой странице представлен обзор всех общедоступных методов DataFrame.
-
Двумерная структура данных, представляющая данные в виде таблицы со строками и столбцами.
- Параметры:
-
-
datadict, Sequence, ndarray, Series, or pandas.DataFrame -
Двумерные данные в различных форматах; входной словарь должен содержать последовательности, генераторы или
range. Последовательность может содержать Series или другие последовательности. -
schemaSequence of str, (str,DataType) pairs, or a {str:DataType,} dict -
Схема результирующего DataFrame. Схему можно задать несколькими способами:
- В виде словаря пар {имя:тип}; если тип равен None, он будет определён автоматически.
- В виде списка имён столбцов; в этом случае типы определяются автоматически.
- В виде списка пар (имя,тип); это эквивалентно форме словаря.
Порядок схемы определяет порядок столбцов таблицы. При передаче словаря сохраняется порядок вставки элементов. Чтобы переопределить типы данных отдельных столбцов по имени, не меняя порядок столбцов, используйте вместо этого
schema_overrides.Если вы укажете список имён столбцов, не совпадающий с именами в исходных данных, указанные здесь имена заменят их. Количество имён, заданных в схеме, должно соответствовать размерностям исходных данных.
Если задано значение
None(по умолчанию), схема выводится из данных. -
schema_overridesdict, default None -
Позволяет задать или переопределить типы одного или нескольких столбцов; обратите внимание, что любые типы данных, выведенные из параметра schema, будут переопределены.
Количество записей в схеме должно соответствовать размерностям исходных данных, если только не передаётся последовательность словарей; в этом случае можно задать частичную схему, чтобы предотвратить загрузку определённых полей.
-
strictbool, default True -
Вызывает ошибку, если какое-либо значение
dataне соответствует в точности заданному или выведенному типу данных для этого столбца. Если задано значениеFalse, значения, не соответствующие типу данных, приводятся к этому типу или, если приведение невозможно, заменяются на null. -
orient{‘col’, ‘row’}, default None -
Определяет, следует ли интерпретировать двумерные данные как столбцы или как строки. Если значение равно None, ориентация определяется путём сопоставления столбцов и размерностей данных. Если это не позволяет однозначно определить ориентацию, используются столбцы.
-
infer_schema_lengthint or None -
Максимальное количество строк, просматриваемых при выводе схемы. Если задано значение
None, могут быть просмотрены все данные (это может занять много времени). Этот параметр применяется только в том случае, если входные данные представляют собой последовательность или генератор строк; остальные входные данные считываются как есть. -
nan_to_nullbool, default False -
Если данные получены из одного или нескольких массивов numpy, можно преобразовать значения np.nan во входных данных в null. Для всех остальных входных данных этот параметр ничего не делает.
-
heightint or None, default None -
Позволяет создавать DataFrame с нулевой шириной и заданной высотой. Если передан вместе с данными, гарантирует, что результирующий DataFrame будет иметь эту высоту.
Предупреждение
Эта функциональность считается нестабильной. Она может быть изменена в любой момент, и это не будет считаться несовместимым изменением.
-
Примечания
Polars явно не поддерживает наследование от своих основных типов данных. Возможные обходные решения описаны в следующем обсуждении на GitHub: pola-rs/polars#2846
Примеры
Создание DataFrame из словаря:
>>> data = {"a": [1, 2], "b": [3, 4]} >>> df = pl.DataFrame(data) >>> df shape: (2, 2) ┌─────┬─────┐ │ a ┆ b │ │ --- ┆ --- │ │ i64 ┆ i64 │ ╞═════╪═════╡ │ 1 ┆ 3 │ │ 2 ┆ 4 │ └─────┴─────┘Обратите внимание, что типы данных автоматически определяются как polars Int64:
>>> df.dtypes [Int64, Int64]
Чтобы задать более подробную/точную схему таблицы, можно передать параметр
schemaсо словарём пар (имя,тип)…>>> data = {"col1": [0, 2], "col2": [3, 7]} >>> df2 = pl.DataFrame(data, schema={"col1": pl.Float32, "col2": pl.Int64}) >>> df2 shape: (2, 2) ┌──────┬──────┐ │ col1 ┆ col2 │ │ --- ┆ --- │ │ f32 ┆ i64 │ ╞══════╪══════╡ │ 0.0 ┆ 3 │ │ 2.0 ┆ 7 │ └──────┴──────┘…последовательностью пар (имя,тип)…
>>> data = {"col1": [1, 2], "col2": [3, 4]} >>> df3 = pl.DataFrame(data, schema=[("col1", pl.Float32), ("col2", pl.Int64)]) >>> df3 shape: (2, 2) ┌──────┬──────┐ │ col1 ┆ col2 │ │ --- ┆ --- │ │ f32 ┆ i64 │ ╞══════╪══════╡ │ 1.0 ┆ 3 │ │ 2.0 ┆ 4 │ └──────┴──────┘…или списком типизированных Series.
>>> data = [ ... pl.Series("col1", [1, 2], dtype=pl.Float32), ... pl.Series("col2", [3, 4], dtype=pl.Int64), ... ] >>> df4 = pl.DataFrame(data) >>> df4 shape: (2, 2) ┌──────┬──────┐ │ col1 ┆ col2 │ │ --- ┆ --- │ │ f32 ┆ i64 │ ╞══════╪══════╡ │ 1.0 ┆ 3 │ │ 2.0 ┆ 4 │ └──────┴──────┘Создание DataFrame из массива numpy ndarray с указанием имён столбцов:
>>> import numpy as np >>> data = np.array([(1, 2), (3, 4)], dtype=np.int64) >>> df5 = pl.DataFrame(data, schema=["a", "b"], orient="col") >>> df5 shape: (2, 2) ┌─────┬─────┐ │ a ┆ b │ │ --- ┆ --- │ │ i64 ┆ i64 │ ╞═════╪═════╡ │ 1 ┆ 3 │ │ 2 ┆ 4 │ └─────┴─────┘
Создание DataFrame из списка списков с указанием ориентации по строкам:
>>> data = [[1, 2, 3], [4, 5, 6]] >>> df6 = pl.DataFrame(data, schema=["a", "b", "c"], orient="row") >>> df6 shape: (2, 3) ┌─────┬─────┬─────┐ │ a ┆ b ┆ c │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ i64 │ ╞═════╪═════╪═════╡ │ 1 ┆ 2 ┆ 3 │ │ 4 ┆ 5 ┆ 6 │ └─────┴─────┴─────┘
Методы:
class polars.DataFrame(
data: FrameInitTypes | None = None,
schema: SchemaDefinition | None = None,
*,
schema_overrides: SchemaDict | None = None,
strict: bool = True,
orient: Orientation | None = None,
infer_schema_length: int | None = 100,
nan_to_null: bool = False,
height: int | None = None,
) Приблизительное количество уникальных значений.
Возвращает
kнаименьших строк.Преобразует типы данных столбцов DataFrame в указанные типы.
Создаёт пустую копию DataFrame (n=0) или копию из
nстрок, заполненных null-значениями (n>0).Создаёт копию этого DataFrame.
Возвращает упорядоченное отображение имён столбцов на соответствующие типы данных.
Возвращает парные коэффициенты корреляции Пирсона между столбцами.
Возвращает количество ненулевых элементов в каждом столбце.
Сводная статистика DataFrame.
Считывает сериализованный DataFrame из файла.
Удаляет столбцы из DataFrame.
Удаляет один столбец на месте и возвращает удалённый столбец.
Удаляет все строки, содержащие одно или несколько значений NaN.
Удаляет все строки, содержащие одно или несколько null-значений.
Проверяет, равен ли DataFrame другому DataFrame.
Возвращает оценку общего размера памяти (кучи), выделенной для
DataFrame.Преобразует DataFrame в длинный формат, разворачивая указанные столбцы.
Расширяет память, используемую этим
DataFrame, значениями изother.Заполняет значения NaN с плавающей точкой результатами вычисления выражения.
Заполняет null-значения указанным значением или с помощью заданной стратегии.
Фильтрует строки, оставляя те, которые соответствуют заданным выражениям-предикатам.
Выполняет горизонтальную свёртку DataFrame.
Выбирает строки этого DataFrame по заданным индексам.
Выбирает каждую n-ю строку DataFrame и возвращает их в виде нового DataFrame.
Возвращает один столбец по имени.
Находит индекс столбца по имени.
Возвращает DataFrame в виде списка Series.
Возвращает компактный предварительный просмотр DataFrame.
Начинает операцию группировки.
Группирует данные по временному значению (или значению индекса типа Int32, Int64).
Вычисляет хеши строк этого DataFrame и объединяет их.
Возвращает первые
nстрок.Возвращает новый DataFrame, расширенный по горизонтали несколькими Series.
Вставляет Series (или выражение) по указанному индексу столбца.
Интерполирует промежуточные значения.
Возвращает маску всех повторяющихся строк в этом DataFrame.
Возвращает
True, если DataFrame не содержит строк.Проверяет, отсортирован ли DataFrame по заданным столбцам.
Возвращает маску всех уникальных строк в этом DataFrame.
Возвращает DataFrame как скаляр или элемент в заданной строке и столбце.
Возвращает итератор по столбцам этого DataFrame.
Возвращает итератор по строкам DataFrame со значениями в нативном формате Python.
Возвращает итератор по срезам базового DataFrame без копирования.
Выполняет соединение по аналогии с SQL.
Выполняет соединение типа asof.
Выполняет соединение на основе одного или нескольких предикатов равенства или неравенства.
Начинает ленивый запрос с текущего этапа.
Возвращает первые
nстрок.Применяет eager-функции к столбцам DataFrame.
Применяет пользовательскую функцию (UDF) к строкам DataFrame.
Приводит схему LazyFrame к заданной схеме или изменяет её.
Вычисляет максимальное значение для каждого столбца DataFrame.
Находит максимальное значение по горизонтали среди столбцов.
Вычисляет среднее значение для каждого столбца DataFrame.
Вычисляет среднее значение по горизонтали среди всех столбцов.
Вычисляет медианное значение для каждого столбца DataFrame.
Преобразует DataFrame из широкого формата в длинный.
Объединяет два отсортированных DataFrame по отсортированному ключу.
Вычисляет минимальное значение для каждого столбца DataFrame.
Находит минимальное значение по горизонтали среди столбцов.
Возвращает количество чанков, используемых ChunkedArray этого DataFrame.
Возвращает количество уникальных строк или уникальных подмножеств строк.
Создаёт новый DataFrame с количеством null-значений в каждом столбце.
Группирует данные по заданным столбцам и возвращает группы в виде отдельных DataFrame.
Предоставляет структурированный способ применить последовательность пользовательских функций (UDF).
Создаёт сводную таблицу в стиле электронной таблицы в виде DataFrame.
Вычисляет произведение значений в каждом столбце DataFrame.
Вычисляет квантиль для каждого столбца DataFrame.
Перераспределяет данные этого DataFrame в непрерывную область памяти.
Удаляет строки, соответствующие заданным выражениям-предикатам.
Переименовывает столбцы.
Заменяет столбец по указанному индексу.
Разворачивает DataFrame в обратном порядке.
Создаёт скользящие группы на основе временного столбца или столбца с целыми числами.
Возвращает значения одной строки по индексу или предикату.
Возвращает все данные DataFrame в виде списка строк со значениями в нативном формате Python.
Возвращает все данные в виде словаря со значениями в нативном формате Python, ключами которого служит указанный столбец.
Выбирает случайную выборку из этого DataFrame.
Выбирает столбцы из этого DataFrame.
Выбирает столбцы из этого DataFrame.
Сериализует этот DataFrame в файл или строку в формате JSON.
Помечает столбец как отсортированный.
Сдвигает значения на указанное количество индексов.
Показывает первые
nстрок.Уменьшает объём памяти, используемой DataFrame.
Возвращает срез этого DataFrame.
Сортирует DataFrame по заданным столбцам.
Выполняет SQL-запрос к DataFrame.
Вычисляет стандартное отклонение для каждого столбца DataFrame.
Вычисляет сумму значений в каждом столбце DataFrame.
Суммирует все значения по горизонтали среди столбцов.
Возвращает последние
nстрок.Собирает базовые массивы Arrow в таблицу Arrow.
Преобразует DataFrame в словарь, сопоставляющий имена столбцов со значениями.
Преобразует каждую строку в словарь со значениями в нативном формате Python.
Преобразует категориальные переменные в фиктивные (индикаторные) переменные.
Преобразует DataFrame в строковое представление, пригодное для создания объекта.
Преобразует DataFrame в массив Jax или словарь массивов Jax.
Преобразует этот DataFrame в массив NumPy ndarray.
Преобразует этот DataFrame в DataFrame библиотеки pandas.
Выбирает столбец как Series по указанному индексу.
Преобразует
DataFrameвSeriesтипаStruct.Преобразует DataFrame в тензор, набор данных или словарь тензоров PyTorch.
Возвращает
kнаибольших строк.Транспонирует DataFrame относительно диагонали.
Удаляет повторяющиеся строки из этого DataFrame.
Разбивает столбцы struct на отдельные столбцы для каждого из их полей.
Преобразует DataFrame из широкого формата в длинный.
Преобразует длинную таблицу в широкую без агрегации.
Обновляет значения в этом
DataFrameзначениями изother.Выполняет увеличение частоты дискретизации DataFrame с регулярным интервалом.
Вычисляет дисперсию для каждого столбца DataFrame.
Расширяет DataFrame по вертикали, добавляя к нему другой DataFrame.
Добавляет столбцы в этот DataFrame.
Добавляет столбцы в этот DataFrame.
Добавляет столбец по индексу 0 со счётчиком строк.
Добавляет индекс строк в качестве первого столбца DataFrame.
Записывает данные в файл Apache Avro.
Копирует
DataFrameв формате CSV в системный буфер обмена с помощьюwrite_csv.Записывает данные в файл с разделителями-запятыми (CSV).
Записывает данные из DataFrame Polars в базу данных.
Записывает DataFrame как таблицу Delta.
Записывает данные фрейма в таблицу книги или листа Excel.
Записать DataFrame в таблицу Iceberg.
Записать данные в двоичный поток Arrow IPC или файл Feather.
Записать данные в поток пакетов записей Arrow IPC.
Сериализовать в представление JSON.
Сериализовать в представление JSON с разделителями-символами новой строки.
Записать данные в файл Apache Parquet.
Атрибуты:
Получить или задать имена столбцов.
Получить типы данных столбцов.
Получить флаги, заданные для столбцов этого DataFrame.
Получить количество строк.
Создать пространство имён для построения графиков.
Получить упорядоченное сопоставление имён столбцов с их типами данных.
Получить форму DataFrame.
Создать Great Table для стилизации.
Получить количество столбцов.
-
Приблизительное количество уникальных значений.
Устарело с версии 0.20.11: Вместо этого используйте метод
select(pl.all().approx_n_unique()).Для оценки мощности множества используется алгоритм HyperLogLog++.
Примеры
>>> df = pl.DataFrame( ... { ... "a": [1, 2, 3, 4], ... "b": [1, 2, 1, 1], ... } ... ) >>> df.approx_n_unique() shape: (1, 2) ┌─────┬─────┐ │ a ┆ b │ │ --- ┆ --- │ │ u32 ┆ u32 │ ╞═════╪═════╡ │ 4 ┆ 2 │ └─────┴─────┘
approx_n_unique() → DataFrame
-
Вернуть
kнаименьших строк.Ненулевые элементы всегда имеют приоритет над null-элементами независимо от значения
reverse. Порядок строк в результате не гарантируется. Если требуется отсортировать результат, вызовитеsort()после этой функции.Изменено в версии 1.0.0: Параметр
descendingпереименован вreverse.- Параметры:
-
- k
-
Количество возвращаемых строк.
- by
-
Столбец или столбцы, используемые для определения строк с наименьшими значениями. Принимает выражения. Строки интерпретируются как имена столбцов.
- reverse
-
Рассматривать
kнаибольших элементов столбца или столбцовby(вместоkнаименьших). Для каждого столбца отдельно можно передать последовательность логических значений.
См. также
Примеры
>>> df = pl.DataFrame( ... { ... "a": ["a", "b", "a", "b", "b", "c"], ... "b": [2, 1, 1, 3, 2, 1], ... } ... )Получить строки, содержащие 4 наименьших значения в столбце b.
>>> df.bottom_k(4, by="b") shape: (4, 2) ┌─────┬─────┐ │ a ┆ b │ │ --- ┆ --- │ │ str ┆ i64 │ ╞═════╪═════╡ │ b ┆ 1 │ │ a ┆ 1 │ │ c ┆ 1 │ │ a ┆ 2 │ └─────┴─────┘
Получить строки, содержащие 4 наименьших значения при сортировке по столбцам a и b.
>>> df.bottom_k(4, by=["a", "b"]) shape: (4, 2) ┌─────┬─────┐ │ a ┆ b │ │ --- ┆ --- │ │ str ┆ i64 │ ╞═════╪═════╡ │ a ┆ 1 │ │ a ┆ 2 │ │ b ┆ 1 │ │ b ┆ 2 │ └─────┴─────┘
bottom_k( k: int, *, by: IntoExpr | Iterable[IntoExpr], reverse: bool | Sequence[bool] = False, ) → DataFrame-
Привести тип данных столбца или столбцов DataFrame к указанному типу или типам.
- Параметры:
-
- dtypes
-
Сопоставление имён столбцов (или селектора) с типами данных либо один тип данных, к которому будут приведены все столбцы.
- strict
-
Вызывать исключение, если приведение типов недопустимо для строк после проталкивания предикатов. Если
False, недопустимое приведение типов приведёт к значениям null.
Примеры
>>> from datetime import date >>> df = pl.DataFrame( ... { ... "foo": [1, 2, 3], ... "bar": [6.0, 7.0, 8.0], ... "ham": [date(2020, 1, 2), date(2021, 3, 4), date(2022, 5, 6)], ... } ... )Привести типы данных отдельных столбцов фрейма к указанным типам:
>>> df.cast({"foo": pl.Float32, "bar": pl.UInt8}) shape: (3, 3) ┌─────┬─────┬────────────┐ │ foo ┆ bar ┆ ham │ │ --- ┆ --- ┆ --- │ │ f32 ┆ u8 ┆ date │ ╞═════╪═════╪════════════╡ │ 1.0 ┆ 6 ┆ 2020-01-02 │ │ 2.0 ┆ 7 ┆ 2021-03-04 │ │ 3.0 ┆ 8 ┆ 2022-05-06 │ └─────┴─────┴────────────┘Привести тип данных всех столбцов фрейма, соответствующих одному типу (или группе типов), к другому типу:
>>> df.cast({pl.Date: pl.Datetime}) shape: (3, 3) ┌─────┬─────┬─────────────────────┐ │ foo ┆ bar ┆ ham │ │ --- ┆ --- ┆ --- │ │ i64 ┆ f64 ┆ datetime[μs] │ ╞═════╪═════╪═════════════════════╡ │ 1 ┆ 6.0 ┆ 2020-01-02 00:00:00 │ │ 2 ┆ 7.0 ┆ 2021-03-04 00:00:00 │ │ 3 ┆ 8.0 ┆ 2022-05-06 00:00:00 │ └─────┴─────┴─────────────────────┘Использовать селекторы для определения столбцов, типы которых нужно изменить:
>>> import polars.selectors as cs >>> df.cast({cs.numeric(): pl.UInt32, cs.temporal(): pl.String}) shape: (3, 3) ┌─────┬─────┬────────────┐ │ foo ┆ bar ┆ ham │ │ --- ┆ --- ┆ --- │ │ u32 ┆ u32 ┆ str │ ╞═════╪═════╪════════════╡ │ 1 ┆ 6 ┆ 2020-01-02 │ │ 2 ┆ 7 ┆ 2021-03-04 │ │ 3 ┆ 8 ┆ 2022-05-06 │ └─────┴─────┴────────────┘Привести типы данных всех столбцов фрейма к указанному типу:
>>> df.cast(pl.String).to_dict(as_series=False) {'foo': ['1', '2', '3'], 'bar': ['6.0', '7.0', '8.0'], 'ham': ['2020-01-02', '2021-03-04', '2022-05-06']}
cast( dtypes: Mapping[ColumnNameOrSelector | PolarsDataType, PolarsDataType | PythonDataType] | PolarsDataType | Schema, *, strict: bool = True, ) → DataFrame-
Создать пустую копию DataFrame (n=0) или копию с
nстроками, заполненными null (n>0).Возвращает DataFrame с
nстроками, заполненными null, и идентичной схемой.nможет превышать текущее количество строк в DataFrame.- Параметры:
-
- n
-
Количество строк (заполненных null), возвращаемых в очищенном фрейме.
См. также
-
clone -
Недорогое глубокое копирование/создание клона.
Примеры
>>> df = pl.DataFrame( ... { ... "a": [None, 2, 3, 4], ... "b": [0.5, None, 2.5, 13], ... "c": [True, True, False, None], ... } ... ) >>> df.clear() shape: (0, 3) ┌─────┬─────┬──────┐ │ a ┆ b ┆ c │ │ --- ┆ --- ┆ --- │ │ i64 ┆ f64 ┆ bool │ ╞═════╪═════╪══════╡ └─────┴─────┴──────┘>>> df.clear(n=2) shape: (2, 3) ┌──────┬──────┬──────┐ │ a ┆ b ┆ c │ │ --- ┆ --- ┆ --- │ │ i64 ┆ f64 ┆ bool │ ╞══════╪══════╪══════╡ │ null ┆ null ┆ null │ │ null ┆ null ┆ null │ └──────┴──────┴──────┘
clear( n: int = 0, ) → DataFrame-
Создать копию этого DataFrame.
Это недорогая операция, которая не копирует данные.
См. также
-
clear -
Создать пустую копию текущего DataFrame с идентичной схемой, но без данных.
Примеры
>>> df = pl.DataFrame( ... { ... "a": [1, 2, 3, 4], ... "b": [0.5, 4, 10, 13], ... "c": [True, True, False, True], ... } ... ) >>> df.clone() shape: (4, 3) ┌─────┬──────┬───────┐ │ a ┆ b ┆ c │ │ --- ┆ --- ┆ --- │ │ i64 ┆ f64 ┆ bool │ ╞═════╪══════╪═══════╡ │ 1 ┆ 0.5 ┆ true │ │ 2 ┆ 4.0 ┆ true │ │ 3 ┆ 10.0 ┆ false │ │ 4 ┆ 13.0 ┆ true │ └─────┴──────┴───────┘ -
clone() → DataFrame
-
Получить упорядоченное сопоставление имён столбцов с их типами данных.
Это псевдоним свойства
schema.См. также
Примечания
Этот метод включён для упрощения написания кода, общего для DataFrame и LazyFrame.
Примеры
Определить схему.
>>> df = pl.DataFrame( ... { ... "foo": [1, 2, 3], ... "bar": [6.0, 7.0, 8.0], ... "ham": ["a", "b", "c"], ... } ... ) >>> df.collect_schema() Schema({'foo': Int64, 'bar': Float64, 'ham': String})Получить доступ к различным свойствам схемы с помощью объекта
Schema.>>> schema = df.collect_schema() >>> schema["bar"] Float64 >>> schema.names() ['foo', 'bar', 'ham'] >>> schema.dtypes() [Int64, Float64, String] >>> schema.len() 3
collect_schema() → Schema
-
Получить или задать имена столбцов.
- Возвращает:
-
- список str
-
Список, содержащий имена всех столбцов в их исходном порядке.
Примеры
>>> df = pl.DataFrame( ... { ... "foo": [1, 2, 3], ... "bar": [6, 7, 8], ... "ham": ["a", "b", "c"], ... } ... ) >>> df.columns ['foo', 'bar', 'ham']Задать имена столбцов:
>>> df.columns = ["apple", "banana", "orange"] >>> df shape: (3, 3) ┌───────┬────────┬────────┐ │ apple ┆ banana ┆ orange │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ str │ ╞═══════╪════════╪════════╡ │ 1 ┆ 6 ┆ a │ │ 2 ┆ 7 ┆ b │ │ 3 ┆ 8 ┆ c │ └───────┴────────┴────────┘
property columns: list[str]
-
Вернуть попарные коэффициенты корреляции Пирсона между столбцами.
Дополнительные сведения см. в документации numpy
corrcoef: https://numpy.org/doc/stable/reference/generated/numpy.corrcoef.html- Параметры:
-
- label
-
Если задано, добавляется новый столбец с указанным именем, содержащий метки (имена столбцов), связанные с каждой строкой.
- **kwargs
-
Именованные аргументы, передаваемые в
numpy.corrcoef.
Примечания
Для работы этой функциональности необходимо установить
numpy.Примеры
>>> df = pl.DataFrame({"foo": [1, 2, 3], "bar": [3, 2, 1], "ham": [7, 8, 9]}) >>> df.corr() shape: (3, 3) ┌──────┬──────┬──────┐ │ foo ┆ bar ┆ ham │ │ --- ┆ --- ┆ --- │ │ f64 ┆ f64 ┆ f64 │ ╞══════╪══════╪══════╡ │ 1.0 ┆ -1.0 ┆ 1.0 │ │ -1.0 ┆ 1.0 ┆ -1.0 │ │ 1.0 ┆ -1.0 ┆ 1.0 │ └──────┴──────┴──────┘ >>> df.corr(label="cols") shape: (3, 4) ┌──────┬──────┬──────┬──────┐ │ cols ┆ foo ┆ bar ┆ ham │ │ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ f64 ┆ f64 ┆ f64 │ ╞══════╪══════╪══════╪══════╡ │ foo ┆ 1.0 ┆ -1.0 ┆ 1.0 │ │ bar ┆ -1.0 ┆ 1.0 ┆ -1.0 │ │ ham ┆ 1.0 ┆ -1.0 ┆ 1.0 │ └──────┴──────┴──────┴──────┘
corr( *, label: str | None = None, **kwargs: Any, ) → DataFrame-
Вернуть количество ненулевых элементов для каждого столбца.
Примеры
>>> df = pl.DataFrame( ... {"a": [1, 2, 3, 4], "b": [1, 2, 1, None], "c": [None, None, None, None]} ... ) >>> df.count() shape: (1, 3) ┌─────┬─────┬─────┐ │ a ┆ b ┆ c │ │ --- ┆ --- ┆ --- │ │ u32 ┆ u32 ┆ u32 │ ╞═════╪═════╪═════╡ │ 4 ┆ 3 ┆ 0 │ └─────┴─────┴─────┘
count() → DataFrame
-
Сводная статистика DataFrame.
- Параметры:
-
- percentiles
-
Один или несколько процентилей, включаемых в сводную статистику. Все значения должны находиться в диапазоне
[0, 1]. -
interpolation{‘nearest’, ‘higher’, ‘lower’, ‘midpoint’, ‘linear’, ‘equiprobable’} -
Метод интерполяции, используемый при вычислении процентилей.
Предупреждение
Мы не гарантируем стабильность результата
describe. Метод выводит статистические данные, которые мы считаем полезными, и в будущем этот набор может измениться. Поэтому не рекомендуется использоватьdescribeпрограммно (в отличие от интерактивного анализа).См. также
Примечания
По умолчанию включается медиана, соответствующая 50-му процентилю.
Примеры
>>> from datetime import date, time >>> df = pl.DataFrame( ... { ... "float": [1.0, 2.8, 3.0], ... "int": [40, 50, None], ... "bool": [True, False, True], ... "str": ["zz", "xx", "yy"], ... "date": [date(2020, 1, 1), date(2021, 7, 5), date(2022, 12, 31)], ... "time": [time(10, 20, 30), time(14, 45, 50), time(23, 15, 10)], ... } ... )Показать статистику фрейма по умолчанию:
>>> df.describe() shape: (9, 7) ┌────────────┬──────────┬──────────┬──────────┬──────┬─────────────────────┬──────────┐ │ statistic ┆ float ┆ int ┆ bool ┆ str ┆ date ┆ time │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ f64 ┆ f64 ┆ f64 ┆ str ┆ str ┆ str │ ╞════════════╪══════════╪══════════╪══════════╪══════╪═════════════════════╪══════════╡ │ count ┆ 3.0 ┆ 2.0 ┆ 3.0 ┆ 3 ┆ 3 ┆ 3 │ │ null_count ┆ 0.0 ┆ 1.0 ┆ 0.0 ┆ 0 ┆ 0 ┆ 0 │ │ mean ┆ 2.266667 ┆ 45.0 ┆ 0.666667 ┆ null ┆ 2021-07-02 16:00:00 ┆ 16:07:10 │ │ std ┆ 1.101514 ┆ 7.071068 ┆ null ┆ null ┆ null ┆ null │ │ min ┆ 1.0 ┆ 40.0 ┆ 0.0 ┆ xx ┆ 2020-01-01 ┆ 10:20:30 │ │ 25% ┆ 2.8 ┆ 40.0 ┆ null ┆ null ┆ 2021-07-05 ┆ 14:45:50 │ │ 50% ┆ 2.8 ┆ 50.0 ┆ null ┆ null ┆ 2021-07-05 ┆ 14:45:50 │ │ 75% ┆ 3.0 ┆ 50.0 ┆ null ┆ null ┆ 2022-12-31 ┆ 23:15:10 │ │ max ┆ 3.0 ┆ 50.0 ┆ 1.0 ┆ zz ┆ 2022-12-31 ┆ 23:15:10 │ └────────────┴──────────┴──────────┴──────────┴──────┴─────────────────────┴──────────┘
Настроить отображаемые процентили, используя линейную интерполяцию:
>>> with pl.Config(tbl_rows=12): ... df.describe( ... percentiles=[0.1, 0.3, 0.5, 0.7, 0.9], ... interpolation="linear", ... ) shape: (11, 7) ┌────────────┬──────────┬──────────┬──────────┬──────┬─────────────────────┬──────────┐ │ statistic ┆ float ┆ int ┆ bool ┆ str ┆ date ┆ time │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ f64 ┆ f64 ┆ f64 ┆ str ┆ str ┆ str │ ╞════════════╪══════════╪══════════╪══════════╪══════╪═════════════════════╪══════════╡ │ count ┆ 3.0 ┆ 2.0 ┆ 3.0 ┆ 3 ┆ 3 ┆ 3 │ │ null_count ┆ 0.0 ┆ 1.0 ┆ 0.0 ┆ 0 ┆ 0 ┆ 0 │ │ mean ┆ 2.266667 ┆ 45.0 ┆ 0.666667 ┆ null ┆ 2021-07-02 16:00:00 ┆ 16:07:10 │ │ std ┆ 1.101514 ┆ 7.071068 ┆ null ┆ null ┆ null ┆ null │ │ min ┆ 1.0 ┆ 40.0 ┆ 0.0 ┆ xx ┆ 2020-01-01 ┆ 10:20:30 │ │ 10% ┆ 1.36 ┆ 41.0 ┆ null ┆ null ┆ 2020-04-20 ┆ 11:13:34 │ │ 30% ┆ 2.08 ┆ 43.0 ┆ null ┆ null ┆ 2020-11-26 ┆ 12:59:42 │ │ 50% ┆ 2.8 ┆ 45.0 ┆ null ┆ null ┆ 2021-07-05 ┆ 14:45:50 │ │ 70% ┆ 2.88 ┆ 47.0 ┆ null ┆ null ┆ 2022-02-07 ┆ 18:09:34 │ │ 90% ┆ 2.96 ┆ 49.0 ┆ null ┆ null ┆ 2022-09-13 ┆ 21:33:18 │ │ max ┆ 3.0 ┆ 50.0 ┆ 1.0 ┆ zz ┆ 2022-12-31 ┆ 23:15:10 │ └────────────┴──────────┴──────────┴──────────┴──────┴─────────────────────┴──────────┘
describe( percentiles: Sequence[float] | float | None = (0.25, 0.5, 0.75, ), *, interpolation: QuantileMethod = 'nearest', ) → DataFrame-
Прочитать сериализованный DataFrame из файла.
- Параметры:
-
- source
-
Путь к файлу или файловоподобному объекту (под файловоподобными объектами подразумеваются объекты с методом
read(), например файловый дескриптор (например, полученный с помощью встроенной функцииopen) илиBytesIO). - format
-
Формат сериализации DataFrame. Возможные варианты:
-
"binary": десериализовать из двоичного формата (байты). Используется по умолчанию. -
"json": десериализовать из формата JSON (строка).
-
См. также
Примечания
Сериализация не является стабильной между версиями Polars: LazyFrame, сериализованный в одной версии Polars, может быть недоступен для десериализации в другой версии.
Примеры
>>> import io >>> df = pl.DataFrame({"a": [1, 2, 3], "b": [4.0, 5.0, 6.0]}) >>> bytes = df.serialize() >>> pl.DataFrame.deserialize(io.BytesIO(bytes)) shape: (3, 2) ┌─────┬─────┐ │ a ┆ b │ │ --- ┆ --- │ │ i64 ┆ f64 │ ╞═════╪═════╡ │ 1 ┆ 4.0 │ │ 2 ┆ 5.0 │ │ 3 ┆ 6.0 │ └─────┴─────┘
classmethod deserialize( source: str | bytes | Path | IOBase, *, format: SerializationFormat = 'binary', ) → DataFrame-
Удалить столбцы из фрейма данных.
- Параметры:
-
- *columns
-
Имена столбцов, которые нужно удалить из фрейма данных. Принимает селектор столбцов.
- strict
-
Проверить наличие всех имён столбцов в текущей схеме и вызвать исключение, если некоторые из них отсутствуют.
Примеры
Удалить один столбец, передав его имя.
>>> df = pl.DataFrame( ... { ... "foo": [1, 2, 3], ... "bar": [6.0, 7.0, 8.0], ... "ham": ["a", "b", "c"], ... } ... ) >>> df.drop("ham") shape: (3, 2) ┌─────┬─────┐ │ foo ┆ bar │ │ --- ┆ --- │ │ i64 ┆ f64 │ ╞═════╪═════╡ │ 1 ┆ 6.0 │ │ 2 ┆ 7.0 │ │ 3 ┆ 8.0 │ └─────┴─────┘Удалить несколько столбцов, передав список их имён.
>>> df.drop(["bar", "ham"]) shape: (3, 1) ┌─────┐ │ foo │ │ --- │ │ i64 │ ╞═════╡ │ 1 │ │ 2 │ │ 3 │ └─────┘
Удалить несколько столбцов, передав селектор.
>>> import polars.selectors as cs >>> df.drop(cs.numeric()) shape: (3, 1) ┌─────┐ │ ham │ │ --- │ │ str │ ╞═════╡ │ a │ │ b │ │ c │ └─────┘
Использовать позиционные аргументы для удаления нескольких столбцов.
>>> df.drop("foo", "ham") shape: (3, 1) ┌─────┐ │ bar │ │ --- │ │ f64 │ ╞═════╡ │ 6.0 │ │ 7.0 │ │ 8.0 │ └─────┘
drop( *columns: ColumnNameOrSelector | Iterable[ColumnNameOrSelector], strict: bool = True, ) → DataFrame-
Удалить один столбец на месте и вернуть удалённый столбец.
- Параметры:
-
- name
-
Имя столбца, который нужно удалить.
- Возвращает:
-
- Series
-
Удалённый столбец.
Примеры
>>> df = pl.DataFrame( ... { ... "foo": [1, 2, 3], ... "bar": [6, 7, 8], ... "ham": ["a", "b", "c"], ... } ... ) >>> df.drop_in_place("ham") shape: (3,) Series: 'ham' [str] [ "a" "b" "c" ]
drop_in_place( name: str, ) → Series-
Удалить все строки, содержащие одно или несколько значений NaN.
Исходный порядок оставшихся строк сохраняется.
- Параметры:
-
- subset
-
Имена столбцов, в которых учитываются значения NaN; если задано
None(по умолчанию), используются все столбцы (обратите внимание: значения NaN могут содержаться только в столбцах с числами с плавающей запятой).
См. также
Примечания
Значение NaN не то же самое, что значение null. Чтобы удалить значения null, используйте
drop_nulls().Примеры
>>> df = pl.DataFrame( ... { ... "foo": [-20.5, float("nan"), 80.0], ... "bar": [float("nan"), 110.0, 25.5], ... "ham": ["xxx", "yyy", None], ... } ... )По умолчанию этот метод удаляет строки, если любое из их значений равно NaN:
>>> df.drop_nans() shape: (1, 3) ┌──────┬──────┬──────┐ │ foo ┆ bar ┆ ham │ │ --- ┆ --- ┆ --- │ │ f64 ┆ f64 ┆ str │ ╞══════╪══════╪══════╡ │ 80.0 ┆ 25.5 ┆ null │ └──────┴──────┴──────┘
Область действия можно ограничить подмножеством столбцов, заданным по имени или селектором. Например, удалим строки, только если значение NaN находится в столбце «bar»:
>>> df.drop_nans(subset=["bar"]) shape: (2, 3) ┌──────┬───────┬──────┐ │ foo ┆ bar ┆ ham │ │ --- ┆ --- ┆ --- │ │ f64 ┆ f64 ┆ str │ ╞══════╪═══════╪══════╡ │ NaN ┆ 110.0 ┆ yyy │ │ 80.0 ┆ 25.5 ┆ null │ └──────┴───────┴──────┘
Чтобы удалять строку, только если все значения равны NaN, требуется другая формулировка:
>>> df = pl.DataFrame( ... { ... "a": [float("nan"), float("nan"), float("nan"), float("nan")], ... "b": [10.0, 2.5, float("nan"), 5.25], ... "c": [65.75, float("nan"), float("nan"), 10.5], ... } ... ) >>> df.filter(~pl.all_horizontal(pl.all().is_nan())) shape: (3, 3) ┌─────┬──────┬───────┐ │ a ┆ b ┆ c │ │ --- ┆ --- ┆ --- │ │ f64 ┆ f64 ┆ f64 │ ╞═════╪══════╪═══════╡ │ NaN ┆ 10.0 ┆ 65.75 │ │ NaN ┆ 2.5 ┆ NaN │ │ NaN ┆ 5.25 ┆ 10.5 │ └─────┴──────┴───────┘
drop_nans( subset: ColumnNameOrSelector | Collection[ColumnNameOrSelector] | None = None, ) → DataFrame-
Удалить все строки, содержащие одно или несколько значений null.
Исходный порядок оставшихся строк сохраняется.
- Параметры:
-
- subset
-
Имена столбцов, в которых учитываются значения null. Если задано
None(по умолчанию), используются все столбцы.
См. также
Примечания
Значение null не то же самое, что значение NaN. Чтобы удалить значения NaN, используйте
drop_nans().Примеры
>>> df = pl.DataFrame( ... { ... "foo": [1, 2, 3], ... "bar": [6, None, 8], ... "ham": ["a", "b", None], ... } ... )По умолчанию этот метод удаляет строки, если любое из их значений равно null.
>>> df.drop_nulls() shape: (1, 3) ┌─────┬─────┬─────┐ │ foo ┆ bar ┆ ham │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ str │ ╞═════╪═════╪═════╡ │ 1 ┆ 6 ┆ a │ └─────┴─────┴─────┘
Область действия можно ограничить подмножеством столбцов, заданным по имени или селектором. Например, удалим строки, если null встречается в любом из целочисленных столбцов:
>>> import polars.selectors as cs >>> df.drop_nulls(subset=cs.integer()) shape: (2, 3) ┌─────┬─────┬──────┐ │ foo ┆ bar ┆ ham │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ str │ ╞═════╪═════╪══════╡ │ 1 ┆ 6 ┆ a │ │ 3 ┆ 8 ┆ null │ └─────┴─────┴──────┘
Ниже приведены дополнительные примеры удаления значений null на основе других условий.
>>> df = pl.DataFrame( ... { ... "a": [None, None, None, None], ... "b": [1, 2, None, 1], ... "c": [1, None, None, 1], ... } ... ) >>> df shape: (4, 3) ┌──────┬──────┬──────┐ │ a ┆ b ┆ c │ │ --- ┆ --- ┆ --- │ │ null ┆ i64 ┆ i64 │ ╞══════╪══════╪══════╡ │ null ┆ 1 ┆ 1 │ │ null ┆ 2 ┆ null │ │ null ┆ null ┆ null │ │ null ┆ 1 ┆ 1 │ └──────┴──────┴──────┘Удалить строку, только если все значения равны null:
>>> df.filter(~pl.all_horizontal(pl.all().is_null())) shape: (3, 3) ┌──────┬─────┬──────┐ │ a ┆ b ┆ c │ │ --- ┆ --- ┆ --- │ │ null ┆ i64 ┆ i64 │ ╞══════╪═════╪══════╡ │ null ┆ 1 ┆ 1 │ │ null ┆ 2 ┆ null │ │ null ┆ 1 ┆ 1 │ └──────┴─────┴──────┘
Удалить столбец, если все значения равны null:
>>> df[[s.name for s in df if not (s.null_count() == df.height)]] shape: (4, 2) ┌──────┬──────┐ │ b ┆ c │ │ --- ┆ --- │ │ i64 ┆ i64 │ ╞══════╪══════╡ │ 1 ┆ 1 │ │ 2 ┆ null │ │ null ┆ null │ │ 1 ┆ 1 │ └──────┴──────┘
drop_nulls( subset: ColumnNameOrSelector | Collection[ColumnNameOrSelector] | None = None, ) → DataFrame-
Получить типы данных столбцов.
Типы данных также отображаются в заголовках столбцов при выводе DataFrame.
- Возвращает:
-
- список DataType
-
Список, содержащий тип данных каждого столбца в исходном порядке.
См. также
Примеры
>>> df = pl.DataFrame( ... { ... "foo": [1, 2, 3], ... "bar": [6.0, 7.0, 8.0], ... "ham": ["a", "b", "c"], ... } ... ) >>> df.dtypes [Int64, Float64, String] >>> df shape: (3, 3) ┌─────┬─────┬─────┐ │ foo ┆ bar ┆ ham │ │ --- ┆ --- ┆ --- │ │ i64 ┆ f64 ┆ str │ ╞═════╪═════╪═════╡ │ 1 ┆ 6.0 ┆ a │ │ 2 ┆ 7.0 ┆ b │ │ 3 ┆ 8.0 ┆ c │ └─────┴─────┴─────┘
property dtypes: list[DataType]
-
Проверить, равен ли DataFrame другому DataFrame.
- Параметры:
-
- other
-
DataFrame для сравнения.
- null_equal
-
Считать значения null равными.
См. также
Примеры
>>> df1 = pl.DataFrame( ... { ... "foo": [1, 2, 3], ... "bar": [6.0, 7.0, 8.0], ... "ham": ["a", "b", "c"], ... } ... ) >>> df2 = pl.DataFrame( ... { ... "foo": [3, 2, 1], ... "bar": [8.0, 7.0, 6.0], ... "ham": ["c", "b", "a"], ... } ... ) >>> df1.equals(df1) True >>> df1.equals(df2) False
equals( other: DataFrame, *, null_equal: bool = True, ) → bool-
Вернуть оценку общего размера памяти (кучи), выделенной для
DataFrame.Оценка размера возвращается в указанных единицах (по умолчанию — байтах).
Эта оценка представляет собой сумму размеров буферов и битовых карт допустимости, включая вложенные массивы. Несколько массивов могут совместно использовать буферы и битовые карты. Поэтому размер двух массивов не равен сумме размеров, вычисленных этой функцией. В частности, размер [
StructArray] является верхней границей.При срезе массива объём выделенной для него памяти остаётся неизменным, поскольку буфер не меняется. Однако эта функция возвращает меньшее значение, так как вычисляет видимый размер буфера, а не его общую ёмкость.
В эту оценку включены буферы FFI.
- Параметры:
-
-
unit{‘b’, ‘kb’, ‘mb’, ‘gb’, ‘tb’} -
Масштабировать возвращаемый размер согласно указанным единицам.
-
Примечания
Для данных с типом Object оценка размера учитывает только размер указателя, что приводит к значительному занижению.
Примеры
>>> df = pl.DataFrame( ... { ... "x": list(reversed(range(1_000_000))), ... "y": [v / 1000 for v in range(1_000_000)], ... "z": [str(v) for v in range(1_000_000)], ... }, ... schema=[("x", pl.UInt32), ("y", pl.Float64), ("z", pl.String)], ... ) >>> df.estimated_size() 17888890 >>> df.estimated_size("mb") 17.0601749420166
estimated_size( unit: SizeUnit = 'b', ) → int | float-
Преобразовать фрейм данных в длинный формат, развернув указанные столбцы.
- Параметры:
-
- columns
-
Имена столбцов, выражения или селектор, определяющий столбцы. Тип данных разворачиваемых столбцов должен быть
ListилиArray. - *more_columns
-
Дополнительные имена столбцов для разворачивания, задаваемые позиционными аргументами.
- empty_as_null
-
Развернуть пустой список/массив в
null. - keep_nulls
-
Развернуть список/массив
nullвnull.
- Возвращает:
-
- DataFrame
Примеры
>>> df = pl.DataFrame( ... { ... "letters": ["a", "a", "b", "c"], ... "numbers": [[1], [2, 3], [4, 5], [6, 7, 8]], ... } ... ) >>> df shape: (4, 2) ┌─────────┬───────────┐ │ letters ┆ numbers │ │ --- ┆ --- │ │ str ┆ list[i64] │ ╞═════════╪═══════════╡ │ a ┆ [1] │ │ a ┆ [2, 3] │ │ b ┆ [4, 5] │ │ c ┆ [6, 7, 8] │ └─────────┴───────────┘ >>> df.explode("numbers", empty_as_null=False) shape: (8, 2) ┌─────────┬─────────┐ │ letters ┆ numbers │ │ --- ┆ --- │ │ str ┆ i64 │ ╞═════════╪═════════╡ │ a ┆ 1 │ │ a ┆ 2 │ │ a ┆ 3 │ │ b ┆ 4 │ │ b ┆ 5 │ │ c ┆ 6 │ │ c ┆ 7 │ │ c ┆ 8 │ └─────────┴─────────┘
explode( columns: ColumnNameOrSelector | Iterable[ColumnNameOrSelector], *more_columns: ColumnNameOrSelector, empty_as_null: bool = <object object>, keep_nulls: bool = True, ) → DataFrame-
Расширить память, используемую этим
DataFrame, значениями изother.В отличие от
vstack, который добавляет фрагменты изotherк фрагментам этогоDataFrame,extendдобавляет данные изotherв базовые области памяти и поэтому может вызвать перераспределение памяти.Если перераспределение памяти не происходит, в результирующей структуре данных не будет дополнительных фрагментов, что обеспечит более быстрое выполнение запросов.
Если после одного добавления планируется выполнить запрос, предпочтительнее использовать
extend, а неvstack. Например, при интерактивных операциях, когда вы добавляетеnстрок и повторно выполняете запрос.Если перед выполнением запроса нужно многократно добавлять данные, предпочтительнее использовать
vstack, а неextend. Например, при чтении нескольких файлов и объединении их в одинDataFrame. В последнем случае завершите последовательность операцийvstackвызовомrechunk.- Параметры:
-
- other
-
DataFrame для добавления по вертикали.
Предупреждение
Этот метод изменяет фрейм данных на месте. Фрейм данных возвращается только для удобства.
См. также
Примеры
>>> df1 = pl.DataFrame({"foo": [1, 2, 3], "bar": [4, 5, 6]}) >>> df2 = pl.DataFrame({"foo": [10, 20, 30], "bar": [40, 50, 60]}) >>> df1.extend(df2) shape: (6, 2) ┌─────┬─────┐ │ foo ┆ bar │ │ --- ┆ --- │ │ i64 ┆ i64 │ ╞═════╪═════╡ │ 1 ┆ 4 │ │ 2 ┆ 5 │ │ 3 ┆ 6 │ │ 10 ┆ 40 │ │ 20 ┆ 50 │ │ 30 ┆ 60 │ └─────┴─────┘
extend( other: DataFrame, ) → DataFrame-
Заполнить значения NaN с плавающей точкой результатом вычисления выражения.
- Параметры:
-
- value
-
Значение для заполнения значений NaN.
- Возвращает:
-
- DataFrame
-
DataFrame, в котором значения NaN заменены заданным значением.
См. также
Примечания
Значение NaN не то же самое, что значение null. Чтобы заполнить значения null, используйте
fill_null().Примеры
>>> df = pl.DataFrame( ... { ... "a": [1.5, 2, float("nan"), 4], ... "b": [0.5, 4, float("nan"), 13], ... } ... ) >>> df.fill_nan(99) shape: (4, 2) ┌──────┬──────┐ │ a ┆ b │ │ --- ┆ --- │ │ f64 ┆ f64 │ ╞══════╪══════╡ │ 1.5 ┆ 0.5 │ │ 2.0 ┆ 4.0 │ │ 99.0 ┆ 99.0 │ │ 4.0 ┆ 13.0 │ └──────┴──────┘
fill_nan( value: Expr | int | float | None, ) → DataFrame-
Заполнить значения null указанным значением или согласно заданной стратегии.
- Параметры:
-
- value
-
Значение для заполнения значений null.
-
strategy{None, ‘forward’, ‘backward’, ‘min’, ‘max’, ‘mean’, ‘zero’, ‘one’} -
Стратегия заполнения значений null.
- limit
-
Количество подряд идущих значений null для заполнения при использовании стратегии «forward» или «backward».
- matches_supertype
-
Заполнять все соответствующие супертипы значения заполнения
value.
- Возвращает:
-
- DataFrame
-
DataFrame, в котором значения None заменены согласно стратегии заполнения.
См. также
Примечания
Значение null не то же самое, что значение NaN. Чтобы заполнить значения NaN, используйте
fill_nan().Примеры
>>> df = pl.DataFrame( ... { ... "a": [1, 2, None, 4], ... "b": [0.5, 4, None, 13], ... } ... ) >>> df.fill_null(99) shape: (4, 2) ┌─────┬──────┐ │ a ┆ b │ │ --- ┆ --- │ │ i64 ┆ f64 │ ╞═════╪══════╡ │ 1 ┆ 0.5 │ │ 2 ┆ 4.0 │ │ 99 ┆ 99.0 │ │ 4 ┆ 13.0 │ └─────┴──────┘ >>> df.fill_null(strategy="forward") shape: (4, 2) ┌─────┬──────┐ │ a ┆ b │ │ --- ┆ --- │ │ i64 ┆ f64 │ ╞═════╪══════╡ │ 1 ┆ 0.5 │ │ 2 ┆ 4.0 │ │ 2 ┆ 4.0 │ │ 4 ┆ 13.0 │ └─────┴──────┘>>> df.fill_null(strategy="max") shape: (4, 2) ┌─────┬──────┐ │ a ┆ b │ │ --- ┆ --- │ │ i64 ┆ f64 │ ╞═════╪══════╡ │ 1 ┆ 0.5 │ │ 2 ┆ 4.0 │ │ 4 ┆ 13.0 │ │ 4 ┆ 13.0 │ └─────┴──────┘
>>> df.fill_null(strategy="zero") shape: (4, 2) ┌─────┬──────┐ │ a ┆ b │ │ --- ┆ --- │ │ i64 ┆ f64 │ ╞═════╪══════╡ │ 1 ┆ 0.5 │ │ 2 ┆ 4.0 │ │ 0 ┆ 0.0 │ │ 4 ┆ 13.0 │ └─────┴──────┘
fill_null( value: Any | Expr | None = None, strategy: FillNullStrategy | None = None, limit: int | None = None, *, matches_supertype: bool = True, ) → DataFrame-
Отфильтровать строки, оставив те, которые соответствуют заданному предикату или выражениям-предикатам.
Исходный порядок оставшихся строк сохраняется.
Остаются только строки, для которых предикат даёт значение True; строки, для которых предикат даёт False или null, отбрасываются.
- Параметры:
-
- predicates
-
Выражение или выражения, возвращающие логический Series.
- constraints
-
Фильтры столбцов; используйте
name = valueдля фильтрации столбцов по заданному значению. Каждый фильтр работает так же, какpl.col(name).eq(value), а условия всех фильтров неявно объединяются оператором&.
См. также
Примечания
Если вы переходите с Pandas и выполняете фильтрацию на основе сравнения двух или более столбцов, обратите внимание: в Polars любое сравнение с участием значений
nullдаст результатnull, а не логическое значение True или False. Поэтому такие строки не сохраняются. Чтобы избежать неожиданного поведения, убедитесь, что значения null обрабатываются надлежащим образом (см. примеры ниже).Примеры
>>> df = pl.DataFrame( ... { ... "foo": [1, 2, 3, None, 4, None, 0], ... "bar": [6, 7, 8, None, None, 9, 0], ... "ham": ["a", "b", "c", None, "d", "e", "f"], ... } ... )Отфильтровать строки, соответствующие условию:
>>> df.filter(pl.col("foo") > 1) shape: (3, 3) ┌─────┬──────┬─────┐ │ foo ┆ bar ┆ ham │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ str │ ╞═════╪══════╪═════╡ │ 2 ┆ 7 ┆ b │ │ 3 ┆ 8 ┆ c │ │ 4 ┆ null ┆ d │ └─────┴──────┴─────┘Отфильтровать строки по нескольким условиям, объединённым операторами and/or:
>>> df.filter( ... (pl.col("foo") < 3) & (pl.col("ham") == "a"), ... ) shape: (1, 3) ┌─────┬─────┬─────┐ │ foo ┆ bar ┆ ham │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ str │ ╞═════╪═════╪═════╡ │ 1 ┆ 6 ┆ a │ └─────┴─────┴─────┘>>> df.filter( ... (pl.col("foo") == 1) | (pl.col("ham") == "c"), ... ) shape: (2, 3) ┌─────┬─────┬─────┐ │ foo ┆ bar ┆ ham │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ str │ ╞═════╪═════╪═════╡ │ 1 ┆ 6 ┆ a │ │ 3 ┆ 8 ┆ c │ └─────┴─────┴─────┘Задать несколько фильтров, используя синтаксис
*args:>>> df.filter( ... pl.col("foo") <= 2, ... ~pl.col("ham").is_in(["b", "c"]), ... ) shape: (2, 3) ┌─────┬─────┬─────┐ │ foo ┆ bar ┆ ham │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ str │ ╞═════╪═════╪═════╡ │ 1 ┆ 6 ┆ a │ │ 0 ┆ 0 ┆ f │ └─────┴─────┴─────┘Задать несколько фильтров, используя синтаксис
**kwargs:>>> df.filter(foo=2, ham="b") shape: (1, 3) ┌─────┬─────┬─────┐ │ foo ┆ bar ┆ ham │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ str │ ╞═════╪═════╪═════╡ │ 2 ┆ 7 ┆ b │ └─────┴─────┴─────┘
Отфильтровать строки, сравнивая два столбца друг с другом:
>>> df.filter( ... pl.col("foo") == pl.col("bar"), ... ) shape: (1, 3) ┌─────┬─────┬─────┐ │ foo ┆ bar ┆ ham │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ str │ ╞═════╪═════╪═════╡ │ 0 ┆ 0 ┆ f │ └─────┴─────┴─────┘>>> df.filter( ... pl.col("foo") != pl.col("bar"), ... ) shape: (3, 3) ┌─────┬─────┬─────┐ │ foo ┆ bar ┆ ham │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ str │ ╞═════╪═════╪═════╡ │ 1 ┆ 6 ┆ a │ │ 2 ┆ 7 ┆ b │ │ 3 ┆ 8 ┆ c │ └─────┴─────┴─────┘Обратите внимание, что строка со значениями
Noneотфильтровывается. Чтобы сохранить поведение Pandas, используйте:>>> df.filter( ... pl.col("foo").ne_missing(pl.col("bar")), ... ) shape: (5, 3) ┌──────┬──────┬─────┐ │ foo ┆ bar ┆ ham │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ str │ ╞══════╪══════╪═════╡ │ 1 ┆ 6 ┆ a │ │ 2 ┆ 7 ┆ b │ │ 3 ┆ 8 ┆ c │ │ 4 ┆ null ┆ d │ │ null ┆ 9 ┆ e │ └──────┴──────┴─────┘
filter( *predicates: IntoExprColumn | Iterable[IntoExprColumn] | bool | list[bool] | np.ndarray[Any, Any], **constraints: Any, ) → DataFrame-
Получить флаги, заданные для столбцов этого DataFrame.
- Возвращает:
-
- dict
-
Сопоставление имён столбцов с флагами столбцов.
property flags: dict[str, dict[str, bool]]
-
-
Выполняет горизонтальную редукцию DataFrame.
Это можно использовать для эффективного вычисления агрегатов на уровне строк; операция применима к любым типам данных, которые можно привести к общему родительскому типу.
Например, при выполнении арифметической операции над двумя типами данных действуют такие правила приведения к общему типу:
- Int8 + String = String
- Float32 + Int64 = Float32
- Float32 + Float64 = Float64
- Параметры:
-
- operation
-
функция, принимающая два
Seriesи возвращающаяSeries.
Примеры
Горизонтальное суммирование:
>>> df = pl.DataFrame( ... { ... "a": [2, 1, 3], ... "b": [1, 2, 3], ... "c": [1.0, 2.0, 3.0], ... } ... ) >>> df.fold(lambda s1, s2: s1 + s2) shape: (3,) Series: 'a' [f64] [ 4.0 5.0 9.0 ]Горизонтальное вычисление минимума:
>>> df = pl.DataFrame({"a": [2, 1, 3], "b": [1, 2, 3], "c": [1.0, 2.0, 3.0]}) >>> df.fold(lambda s1, s2: s1.zip_with(s1 < s2, s2)) shape: (3,) Series: 'a' [f64] [ 1.0 1.0 3.0 ]Горизонтальная конкатенация строк:
>>> df = pl.DataFrame( ... { ... "a": ["foo", "bar", None], ... "b": [1, 2, 3], ... "c": [1.0, 2.0, 3.0], ... } ... ) >>> df.fold(lambda s1, s2: s1 + s2) shape: (3,) Series: 'a' [str] [ "foo11.0" "bar22.0" null ]Горизонтальная логическая операция «ИЛИ», аналогичная .any() для строк:
>>> df = pl.DataFrame( ... { ... "a": [False, False, True], ... "b": [False, True, False], ... } ... ) >>> df.fold(lambda s1, s2: s1 | s2) shape: (3,) Series: 'a' [bool] [ false true true ]
fold( operation: Callable[[Series, Series], Series], ) → Series-
Выбирает строки этого DataFrame по заданным индексам.
Предупреждение
Эта функциональность экспериментальная. Она может измениться в любой момент, и это не будет считаться нарушением обратной совместимости.
- Параметры:
-
- indices
-
Индексы выбираемых строк.
- null_on_oob
-
Если значение равно true, то при выходе индекса за границы вместо ошибки будет создана строка null.
Примеры
>>> df = pl.DataFrame({"x": [2, 1, 0], "s": ["foo", "bar", "baz"]}) >>> df.gather([2, 0, 0]) shape: (3, 2) ┌─────┬─────┐ │ x ┆ s │ │ --- ┆ --- │ │ i64 ┆ str │ ╞═════╪═════╡ │ 0 ┆ baz │ │ 2 ┆ foo │ │ 2 ┆ foo │ └─────┴─────┘>>> df.gather([0, 10, 1], null_on_oob=True) shape: (3, 2) ┌──────┬──────┐ │ x ┆ s │ │ --- ┆ --- │ │ i64 ┆ str │ ╞══════╪══════╡ │ 2 ┆ foo │ │ null ┆ null │ │ 1 ┆ bar │ └──────┴──────┘
gather( indices: int | Sequence[int] | IntoExpr | Series | np.ndarray[Any, Any], *, null_on_oob: bool = False, ) → DataFrame-
Выбирает каждую n-ю строку DataFrame и возвращает их в виде нового DataFrame.
- Параметры:
-
- n
-
Извлекать каждую n-ю строку.
- offset
-
Начальный индекс.
Примеры
>>> s = pl.DataFrame({"a": [1, 2, 3, 4], "b": [5, 6, 7, 8]}) >>> s.gather_every(2) shape: (2, 2) ┌─────┬─────┐ │ a ┆ b │ │ --- ┆ --- │ │ i64 ┆ i64 │ ╞═════╪═════╡ │ 1 ┆ 5 │ │ 3 ┆ 7 │ └─────┴─────┘>>> s.gather_every(2, offset=1) shape: (2, 2) ┌─────┬─────┐ │ a ┆ b │ │ --- ┆ --- │ │ i64 ┆ i64 │ ╞═════╪═════╡ │ 2 ┆ 6 │ │ 4 ┆ 8 │ └─────┴─────┘
gather_every( n: int, offset: int = 0, ) → DataFrame-
Получает столбец по имени.
- Параметры:
-
- name
-
Строковое имя извлекаемого столбца.
- default
-
Значение, возвращаемое, если столбец не существует; если значение явно не задано, а столбец отсутствует, возникает исключение
ColumnNotFoundError.
- Возвращает:
-
- Series (или произвольное значение по умолчанию, если оно указано).
См. также
Примеры
>>> df = pl.DataFrame({"foo": [1, 2, 3], "bar": [4, 5, 6]}) >>> df.get_column("foo") shape: (3,) Series: 'foo' [i64] [ 1 2 3 ]Обработка отсутствующего столбца: методу можно передать произвольное значение по умолчанию (в противном случае возникает исключение
ColumnNotFoundError).>>> df.get_column("baz", default=pl.Series("baz", ["?", "?", "?"])) shape: (3,) Series: 'baz' [str] [ "?" "?" "?" ] >>> res = df.get_column("baz", default=None) >>> res is None True
get_column( name: str, *, default: Any | NoDefault = <no_default>, ) → Series | Any-
Находит индекс столбца по имени.
- Параметры:
-
- name
-
Имя искомого столбца.
Примеры
>>> df = pl.DataFrame( ... {"foo": [1, 2, 3], "bar": [6, 7, 8], "ham": ["a", "b", "c"]} ... ) >>> df.get_column_index("ham") 2 >>> df.get_column_index("sandwich") ColumnNotFoundError: sandwich
get_column_index( name: str, ) → int-
Возвращает DataFrame в виде списка Series.
Примеры
>>> df = pl.DataFrame({"foo": [1, 2, 3], "bar": [4, 5, 6]}) >>> df.get_columns() [shape: (3,) Series: 'foo' [i64] [ 1 2 3 ], shape: (3,) Series: 'bar' [i64] [ 4 5 6 ]]>>> df = pl.DataFrame( ... { ... "a": [1, 2, 3, 4], ... "b": [0.5, 4, 10, 13], ... "c": [True, True, False, True], ... } ... ) >>> df.get_columns() [shape: (4,) Series: 'a' [i64] [ 1 2 3 4 ], shape: (4,) Series: 'b' [f64] [ 0.5 4.0 10.0 13.0 ], shape: (4,) Series: 'c' [bool] [ true true false true ]]
get_columns() → list[Series]
-
Возвращает наглядный предварительный просмотр DataFrame.
Форматирование выводит по одной строке на столбец, чтобы широкие DataFrame отображались аккуратно. В каждой строке указаны имя столбца, тип данных и несколько первых значений.
Изменено в версии 1.35.0: Параметр
return_as_stringпереименован вreturn_typeи теперь принимает строковые значения'string'и'frame'вместо логических значений True или False.- Параметры:
-
- max_items_per_column
-
Максимальное количество элементов, отображаемых для каждого столбца.
- max_colname_length
-
Максимальная длина отображаемых имён столбцов; более длинные значения обрезаются с добавлением многоточия.
- return_type
-
Изменяет формат возвращаемого значения:
-
None(по умолчанию): Выводит результат glimpse в stdout и возвращаетNone. -
"self": Выводит результат glimpse в stdout и возвращает исходный фрейм. -
"frame": Возвращает результат glimpse в виде нового DataFrame. -
"string": Возвращает результат glimpse в виде строки.
-
См. также
-
describe, head,tail
Примеры
>>> from datetime import date >>> df = pl.DataFrame( ... { ... "a": [1.0, 2.8, 3.0], ... "b": [4, 5, None], ... "c": [True, False, True], ... "d": [None, "b", "c"], ... "e": ["usd", "eur", None], ... "f": [date(2020, 1, 1), date(2021, 1, 2), date(2022, 1, 1)], ... } ... )Вывести результат в формате glimpse в stdout и вернуть
None:>>> res = df.glimpse() Rows: 3 Columns: 6 $ a <f64> 1.0, 2.8, 3.0 $ b <i64> 4, 5, null $ c <bool> True, False, True $ d <str> null, 'b', 'c' $ e <str> 'usd', 'eur', null $ f <date> 2020-01-01, 2021-01-02, 2022-01-01 >>> res is None True
Вернуть результат glimpse в виде строки:
>>> res = df.glimpse(return_type="string") >>> isinstance(res, str) True
Вернуть результат glimpse в виде DataFrame:
>>> df.glimpse(return_type="frame") shape: (6, 3) ┌────────┬───────┬─────────────────────────────────┐ │ column ┆ dtype ┆ values │ │ --- ┆ --- ┆ --- │ │ str ┆ str ┆ list[str] │ ╞════════╪═══════╪═════════════════════════════════╡ │ a ┆ f64 ┆ ["1.0", "2.8", "3.0"] │ │ b ┆ i64 ┆ ["4", "5", null] │ │ c ┆ bool ┆ ["True", "False", "True"] │ │ d ┆ str ┆ [null, "'b'", "'c'"] │ │ e ┆ str ┆ ["'usd'", "'eur'", null] │ │ f ┆ date ┆ ["2020-01-01", "2021-01-02", "… │ └────────┴───────┴─────────────────────────────────┘
Вывести результат в формате glimpse в stdout и вернуть исходный фрейм:
>>> res = df.glimpse(return_type="self") Rows: 3 Columns: 6 $ a <f64> 1.0, 2.8, 3.0 $ b <i64> 4, 5, null $ c <bool> True, False, True $ d <str> null, 'b', 'c' $ e <str> 'usd', 'eur', null $ f <date> 2020-01-01, 2021-01-02, 2022-01-01 >>> res shape: (3, 6) ┌─────┬──────┬───────┬──────┬──────┬────────────┐ │ a ┆ b ┆ c ┆ d ┆ e ┆ f │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ f64 ┆ i64 ┆ bool ┆ str ┆ str ┆ date │ ╞═════╪══════╪═══════╪══════╪══════╪════════════╡ │ 1.0 ┆ 4 ┆ true ┆ null ┆ usd ┆ 2020-01-01 │ │ 2.8 ┆ 5 ┆ false ┆ b ┆ eur ┆ 2021-01-02 │ │ 3.0 ┆ null ┆ true ┆ c ┆ null ┆ 2022-01-01 │ └─────┴──────┴───────┴──────┴──────┴────────────┘
glimpse( *, max_items_per_column: int = 10, max_colname_length: int = 50, return_type: Literal['frame', 'self', 'string'] | None = None, ) → str | DataFrame | None-
Начинает группировку.
- Параметры:
-
- *by
-
Столбец или столбцы для группировки. Принимаются выражения. Строки интерпретируются как имена столбцов.
- maintain_order
-
Обеспечивает соответствие порядка групп порядку входных данных. Работает медленнее, чем группировка по умолчанию. Установка значения
Trueне позволяет использовать потоковый движок.Примечание
Порядок строк внутри каждой группы всегда сохраняется независимо от этого аргумента.
- **named_by
-
Дополнительные столбцы для группировки, задаваемые именованными аргументами. Столбцы будут переименованы в соответствии с именами аргументов.
- Возвращает:
-
- GroupBy
-
Объект, который можно использовать для вычисления агрегатов.
Примеры
Сгруппировать по одному столбцу и вызвать
agg, чтобы вычислить сумму другого столбца в каждой группе.>>> df = pl.DataFrame( ... { ... "a": ["a", "b", "a", "b", "c"], ... "b": [1, 2, 1, 3, 3], ... "c": [5, 4, 3, 2, 1], ... } ... ) >>> df.group_by("a").agg(pl.col("b").sum()) shape: (3, 2) ┌─────┬─────┐ │ a ┆ b │ │ --- ┆ --- │ │ str ┆ i64 │ ╞═════╪═════╡ │ a ┆ 2 │ │ b ┆ 5 │ │ c ┆ 3 │ └─────┴─────┘Задать
maintain_order=True, чтобы порядок групп соответствовал порядку входных данных.>>> df.group_by("a", maintain_order=True).agg(pl.col("c")) shape: (3, 2) ┌─────┬───────────┐ │ a ┆ c │ │ --- ┆ --- │ │ str ┆ list[i64] │ ╞═════╪═══════════╡ │ a ┆ [5, 3] │ │ b ┆ [4, 2] │ │ c ┆ [1] │ └─────┴───────────┘Сгруппировать по нескольким столбцам, передав список их имён.
>>> df.group_by(["a", "b"]).agg(pl.max("c")) shape: (4, 3) ┌─────┬─────┬─────┐ │ a ┆ b ┆ c │ │ --- ┆ --- ┆ --- │ │ str ┆ i64 ┆ i64 │ ╞═════╪═════╪═════╡ │ a ┆ 1 ┆ 5 │ │ b ┆ 2 ┆ 4 │ │ b ┆ 3 ┆ 2 │ │ c ┆ 3 ┆ 1 │ └─────┴─────┴─────┘Для группировки по нескольким столбцам можно также использовать позиционные аргументы. Допускаются и выражения.
>>> df.group_by("a", pl.col("b") // 2).agg(pl.col("c").mean()) shape: (3, 3) ┌─────┬─────┬─────┐ │ a ┆ b ┆ c │ │ --- ┆ --- ┆ --- │ │ str ┆ i64 ┆ f64 │ ╞═════╪═════╪═════╡ │ a ┆ 0 ┆ 4.0 │ │ b ┆ 1 ┆ 3.0 │ │ c ┆ 1 ┆ 1.0 │ └─────┴─────┴─────┘Объект
GroupBy, возвращаемый этим методом, является итерируемым: он возвращает имя и данные каждой группы.>>> for name, data in df.group_by("a"): ... print(name) ... print(data) ('a',) shape: (2, 3) ┌─────┬─────┬─────┐ │ a ┆ b ┆ c │ │ --- ┆ --- ┆ --- │ │ str ┆ i64 ┆ i64 │ ╞═════╪═════╪═════╡ │ a ┆ 1 ┆ 5 │ │ a ┆ 1 ┆ 3 │ └─────┴─────┴─────┘ ('b',) shape: (2, 3) ┌─────┬─────┬─────┐ │ a ┆ b ┆ c │ │ --- ┆ --- ┆ --- │ │ str ┆ i64 ┆ i64 │ ╞═════╪═════╪═════╡ │ b ┆ 2 ┆ 4 │ │ b ┆ 3 ┆ 2 │ └─────┴─────┴─────┘ ('c',) shape: (1, 3) ┌─────┬─────┬─────┐ │ a ┆ b ┆ c │ │ --- ┆ --- ┆ --- │ │ str ┆ i64 ┆ i64 │ ╞═════╪═════╪═════╡ │ c ┆ 3 ┆ 1 │ └─────┴─────┴─────┘
group_by( *by: IntoExpr | Iterable[IntoExpr], maintain_order: bool = False, **named_by: IntoExpr, ) → GroupBy-
Выполняет группировку по значению времени (или индексному значению типа Int32, Int64).
Вычисляются временные окна, а строки распределяются по ним. В отличие от обычной группировки одна строка может входить в несколько групп. По умолчанию окна выглядят следующим образом:
- [start, start + period)
- [start + every, start + every + period)
- [start + 2*every, start + 2*every + period)
- …
где
startопределяется параметрамиstart_by,offset,everyи самой ранней точкой данных. Подробности см. в описании аргументаstart_by.Предупреждение
Столбец индекса должен быть отсортирован по возрастанию. Если передан параметр
group_by, столбец индекса должен быть отсортирован по возрастанию внутри каждой группы.Изменено в версии 0.20.14: Параметр
byпереименован вgroup_by.- Параметры:
-
- index_column
-
Столбец, используемый для группировки по временному окну. Часто имеет тип Date/Datetime. Этот столбец должен быть отсортирован по возрастанию (или, если указан параметр
group_by, отсортирован по возрастанию внутри каждой группы).При динамической группировке по индексам тип данных должен быть одним из {Int32, Int64}. Учтите, что Int32 временно преобразуется в Int64, поэтому при высоких требованиях к производительности используйте столбец Int64.
- every
-
интервал окна
- period
-
длина окна; если значение равно None, используется значение ‘every’
- offset
-
смещение окна; не действует, если
start_byимеет значение ‘datapoint’. По умолчанию равно нулю. - include_boundaries
-
Добавляет нижнюю и верхнюю границы окна в столбцы “_lower_boundary” и “_upper_boundary”. Это снижает производительность, поскольку усложняет распараллеливание.
-
closed{‘left’, ‘right’, ‘both’, ‘none’} -
Определяет, какие стороны временного интервала замкнуты (включены в интервал).
-
label{‘left’, ‘right’, ‘datapoint’} -
Определяет метку окна:
- ‘left’: нижняя граница окна
- ‘right’: верхняя граница окна
- ‘datapoint’: первое значение столбца индекса в заданном окне. Если метка не должна совпадать с одной из границ, выберите этот вариант для максимальной производительности.
- group_by
-
Дополнительно группировать по этому столбцу или этим столбцам.
-
start_by{‘window’, ‘datapoint’, ‘monday’, ‘tuesday’, ‘wednesday’, ‘thursday’, ‘friday’, ‘saturday’, ‘sunday’} -
Стратегия определения начала первого окна.
- ‘window’: Начать с самой ранней временной метки, округлить её с помощью
every, а затем добавитьoffset. Учтите, что недельные окна начинаются в понедельник. - ‘datapoint’: Начать с первой встретившейся точки данных.
-
день недели (действует, только если
everyсодержит'w'):- ‘monday’: Начать окно с понедельника перед первой точкой данных.
- ‘tuesday’: Начать окно со вторника перед первой точкой данных.
- …
- ‘sunday’: Начать окно с воскресенья перед первой точкой данных.
Затем полученное окно сдвигается назад, пока самая ранняя точка данных не окажется внутри него или перед ним.
- ‘window’: Начать с самой ранней временной метки, округлить её с помощью
- Возвращает:
-
- DynamicGroupBy
-
Объект, к которому можно применить
.aggдля вычисления агрегатов по группам. Результат будет отсортирован поindex_column(однако при передаче столбцовgroup_byсортировка будет выполняться только внутри каждой группы).
См. также
Примечания
-
Если вы переходите с pandas, то
# polars df.group_by_dynamic("ts", every="1d").agg(pl.col("value").sum())эквивалентно
# pandas df.set_index("ts").resample("D")["value"].sum().reset_index()Однако, в отличие от pandas, polars не добавляет дополнительные строки для пустых окон. Если требуется, чтобы
index_columnрасполагались через равные интервалы, объедините операцию сDataFrame.upsample(). -
Аргументы
every,periodиoffsetзадаются с помощью следующих строковых обозначений:- 1ns (1 наносекунда)
- 1us (1 микросекунда)
- 1ms (1 миллисекунда)
- 1s (1 секунда)
- 1m (1 минута)
- 1h (1 час)
- 1d (1 календарный день)
- 1w (1 календарная неделя)
- 1mo (1 календарный месяц)
- 1q (1 календарный квартал)
- 1y (1 календарный год)
- 1i (1 единица индекса)
Их можно комбинировать (кроме
every): “3d12h4m25s” # 3 дня, 12 часов, 4 минуты и 25 секундПод «календарным днём» подразумевается соответствующее время следующего дня (который из-за перехода на летнее время может длиться не 24 часа). Аналогично определяются «календарная неделя», «календарный месяц», «календарный квартал» и «календарный год».
При group_by_dynamic для целочисленного столбца окна задаются следующим образом:
- “1i” # длина 1
- “10i” # длина 10
Примеры
>>> from datetime import datetime >>> df = pl.DataFrame( ... { ... "time": pl.datetime_range( ... start=datetime(2021, 12, 16), ... end=datetime(2021, 12, 16, 3), ... interval="30m", ... eager=True, ... ), ... "n": range(7), ... } ... ) >>> df shape: (7, 2) ┌─────────────────────┬─────┐ │ time ┆ n │ │ --- ┆ --- │ │ datetime[μs] ┆ i64 │ ╞═════════════════════╪═════╡ │ 2021-12-16 00:00:00 ┆ 0 │ │ 2021-12-16 00:30:00 ┆ 1 │ │ 2021-12-16 01:00:00 ┆ 2 │ │ 2021-12-16 01:30:00 ┆ 3 │ │ 2021-12-16 02:00:00 ┆ 4 │ │ 2021-12-16 02:30:00 ┆ 5 │ │ 2021-12-16 03:00:00 ┆ 6 │ └─────────────────────┴─────┘Группировка по окнам длительностью 1 час.
>>> df.group_by_dynamic("time", every="1h", closed="right").agg(pl.col("n")) shape: (4, 2) ┌─────────────────────┬───────────┐ │ time ┆ n │ │ --- ┆ --- │ │ datetime[μs] ┆ list[i64] │ ╞═════════════════════╪═══════════╡ │ 2021-12-15 23:00:00 ┆ [0] │ │ 2021-12-16 00:00:00 ┆ [1, 2] │ │ 2021-12-16 01:00:00 ┆ [3, 4] │ │ 2021-12-16 02:00:00 ┆ [5, 6] │ └─────────────────────┴───────────┘Границы окна также можно добавить в результат агрегации.
>>> df.group_by_dynamic( ... "time", every="1h", include_boundaries=True, closed="right" ... ).agg(pl.col("n").mean()) shape: (4, 4) ┌─────────────────────┬─────────────────────┬─────────────────────┬─────┐ │ _lower_boundary ┆ _upper_boundary ┆ time ┆ n │ │ --- ┆ --- ┆ --- ┆ --- │ │ datetime[μs] ┆ datetime[μs] ┆ datetime[μs] ┆ f64 │ ╞═════════════════════╪═════════════════════╪═════════════════════╪═════╡ │ 2021-12-15 23:00:00 ┆ 2021-12-16 00:00:00 ┆ 2021-12-15 23:00:00 ┆ 0.0 │ │ 2021-12-16 00:00:00 ┆ 2021-12-16 01:00:00 ┆ 2021-12-16 00:00:00 ┆ 1.5 │ │ 2021-12-16 01:00:00 ┆ 2021-12-16 02:00:00 ┆ 2021-12-16 01:00:00 ┆ 3.5 │ │ 2021-12-16 02:00:00 ┆ 2021-12-16 03:00:00 ┆ 2021-12-16 02:00:00 ┆ 5.5 │ └─────────────────────┴─────────────────────┴─────────────────────┴─────┘При closed=”left” окно не включает правую границу интервала: [lower_bound, upper_bound)
>>> df.group_by_dynamic("time", every="1h", closed="left").agg(pl.col("n")) shape: (4, 2) ┌─────────────────────┬───────────┐ │ time ┆ n │ │ --- ┆ --- │ │ datetime[μs] ┆ list[i64] │ ╞═════════════════════╪═══════════╡ │ 2021-12-16 00:00:00 ┆ [0, 1] │ │ 2021-12-16 01:00:00 ┆ [2, 3] │ │ 2021-12-16 02:00:00 ┆ [4, 5] │ │ 2021-12-16 03:00:00 ┆ [6] │ └─────────────────────┴───────────┘При closed=”both” временные значения на границах окна входят в две группы.
>>> df.group_by_dynamic("time", every="1h", closed="both").agg(pl.col("n")) shape: (4, 2) ┌─────────────────────┬───────────┐ │ time ┆ n │ │ --- ┆ --- │ │ datetime[μs] ┆ list[i64] │ ╞═════════════════════╪═══════════╡ │ 2021-12-16 00:00:00 ┆ [0, 1, 2] │ │ 2021-12-16 01:00:00 ┆ [2, 3, 4] │ │ 2021-12-16 02:00:00 ┆ [4, 5, 6] │ │ 2021-12-16 03:00:00 ┆ [6] │ └─────────────────────┴───────────┘Динамическую группировку можно сочетать с группировкой по обычным ключам.
>>> df = df.with_columns(groups=pl.Series(["a", "a", "a", "b", "b", "a", "a"])) >>> df shape: (7, 3) ┌─────────────────────┬─────┬────────┐ │ time ┆ n ┆ groups │ │ --- ┆ --- ┆ --- │ │ datetime[μs] ┆ i64 ┆ str │ ╞═════════════════════╪═════╪════════╡ │ 2021-12-16 00:00:00 ┆ 0 ┆ a │ │ 2021-12-16 00:30:00 ┆ 1 ┆ a │ │ 2021-12-16 01:00:00 ┆ 2 ┆ a │ │ 2021-12-16 01:30:00 ┆ 3 ┆ b │ │ 2021-12-16 02:00:00 ┆ 4 ┆ b │ │ 2021-12-16 02:30:00 ┆ 5 ┆ a │ │ 2021-12-16 03:00:00 ┆ 6 ┆ a │ └─────────────────────┴─────┴────────┘ >>> df.group_by_dynamic( ... "time", ... every="1h", ... closed="both", ... group_by="groups", ... include_boundaries=True, ... ).agg(pl.col("n")) shape: (6, 5) ┌────────┬─────────────────────┬─────────────────────┬─────────────────────┬───────────┐ │ groups ┆ _lower_boundary ┆ _upper_boundary ┆ time ┆ n │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ datetime[μs] ┆ datetime[μs] ┆ datetime[μs] ┆ list[i64] │ ╞════════╪═════════════════════╪═════════════════════╪═════════════════════╪═══════════╡ │ a ┆ 2021-12-16 00:00:00 ┆ 2021-12-16 01:00:00 ┆ 2021-12-16 00:00:00 ┆ [0, 1, 2] │ │ a ┆ 2021-12-16 01:00:00 ┆ 2021-12-16 02:00:00 ┆ 2021-12-16 01:00:00 ┆ [2] │ │ a ┆ 2021-12-16 02:00:00 ┆ 2021-12-16 03:00:00 ┆ 2021-12-16 02:00:00 ┆ [5, 6] │ │ a ┆ 2021-12-16 03:00:00 ┆ 2021-12-16 04:00:00 ┆ 2021-12-16 03:00:00 ┆ [6] │ │ b ┆ 2021-12-16 01:00:00 ┆ 2021-12-16 02:00:00 ┆ 2021-12-16 01:00:00 ┆ [3, 4] │ │ b ┆ 2021-12-16 02:00:00 ┆ 2021-12-16 03:00:00 ┆ 2021-12-16 02:00:00 ┆ [4] │ └────────┴─────────────────────┴─────────────────────┴─────────────────────┴───────────┘Динамическая группировка по столбцу индекса.
>>> df = pl.DataFrame( ... { ... "idx": pl.int_range(0, 6, eager=True), ... "A": ["A", "A", "B", "B", "B", "C"], ... } ... ) >>> ( ... df.group_by_dynamic( ... "idx", ... every="2i", ... period="3i", ... include_boundaries=True, ... closed="right", ... ).agg(pl.col("A").alias("A_agg_list")) ... ) shape: (4, 4) ┌─────────────────┬─────────────────┬─────┬─────────────────┐ │ _lower_boundary ┆ _upper_boundary ┆ idx ┆ A_agg_list │ │ --- ┆ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ i64 ┆ list[str] │ ╞═════════════════╪═════════════════╪═════╪═════════════════╡ │ -2 ┆ 1 ┆ -2 ┆ ["A", "A"] │ │ 0 ┆ 3 ┆ 0 ┆ ["A", "B", "B"] │ │ 2 ┆ 5 ┆ 2 ┆ ["B", "B", "C"] │ │ 4 ┆ 7 ┆ 4 ┆ ["C"] │ └─────────────────┴─────────────────┴─────┴─────────────────┘
group_by_dynamic( index_column: IntoExpr, *, every: str | timedelta, period: str | timedelta | None = None, offset: str | timedelta | None = None, include_boundaries: bool = False, closed: ClosedInterval = 'left', label: Label = 'left', group_by: IntoExpr | Iterable[IntoExpr] | None = None, start_by: StartBy = 'window', ) → DynamicGroupBy-
Хеширует и объединяет строки этого DataFrame.
Хеш имеет тип
UInt64.- Параметры:
-
- seed
-
Начальное значение генератора случайных чисел. По умолчанию равно 0.
- seed_1
-
Начальное значение генератора случайных чисел. Если не задано, по умолчанию равно
seed. - seed_2
-
Начальное значение генератора случайных чисел. Если не задано, по умолчанию равно
seed. - seed_3
-
Начальное значение генератора случайных чисел. Если не задано, по умолчанию равно
seed.
Примечания
Эта реализация
hash_rowsне гарантирует стабильность результатов в разных версиях Polars. Стабильность гарантируется только в рамках одной версии.Примеры
>>> df = pl.DataFrame( ... { ... "foo": [1, None, 3, 4], ... "ham": ["a", "b", None, "d"], ... } ... ) >>> df.hash_rows(seed=42) shape: (4,) Series: '' [u64] [ 10783150408545073287 1438741209321515184 10047419486152048166 2047317070637311557 ]
hash_rows( seed: int = 0, seed_1: int | None = None, seed_2: int | None = None, seed_3: int | None = None, ) → Series-
Получает первые
nстрок.- Параметры:
-
- n
-
Количество возвращаемых строк. Если передано отрицательное значение, возвращаются все строки, кроме последних
abs(n).
См. также
-
tail, glimpse,slice
Примеры
>>> df = pl.DataFrame( ... { ... "foo": [1, 2, 3, 4, 5], ... "bar": [6, 7, 8, 9, 10], ... "ham": ["a", "b", "c", "d", "e"], ... } ... ) >>> df.head(3) shape: (3, 3) ┌─────┬─────┬─────┐ │ foo ┆ bar ┆ ham │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ str │ ╞═════╪═════╪═════╡ │ 1 ┆ 6 ┆ a │ │ 2 ┆ 7 ┆ b │ │ 3 ┆ 8 ┆ c │ └─────┴─────┴─────┘Передайте отрицательное значение, чтобы получить все строки,
exceptпоследниеabs(n).>>> df.head(-3) shape: (2, 3) ┌─────┬─────┬─────┐ │ foo ┆ bar ┆ ham │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ str │ ╞═════╪═════╪═════╡ │ 1 ┆ 6 ┆ a │ │ 2 ┆ 7 ┆ b │ └─────┴─────┴─────┘
head( n: int = 5, ) → DataFrame-
Получает количество строк.
- Возвращает:
-
- int
Примеры
>>> df = pl.DataFrame({"foo": [1, 2, 3, 4, 5]}) >>> df.height 5
property height: int
-
Возвращает новый DataFrame, расширенный по горизонтали за счёт добавления нескольких Series.
- Параметры:
-
- columns
-
Series для добавления.
- in_place
-
Изменить объект на месте.
Примеры
>>> df = pl.DataFrame( ... { ... "foo": [1, 2, 3], ... "bar": [6, 7, 8], ... "ham": ["a", "b", "c"], ... } ... ) >>> x = pl.Series("apple", [10, 20, 30]) >>> df.hstack([x]) shape: (3, 4) ┌─────┬─────┬─────┬───────┐ │ foo ┆ bar ┆ ham ┆ apple │ │ --- ┆ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ str ┆ i64 │ ╞═════╪═════╪═════╪═══════╡ │ 1 ┆ 6 ┆ a ┆ 10 │ │ 2 ┆ 7 ┆ b ┆ 20 │ │ 3 ┆ 8 ┆ c ┆ 30 │ └─────┴─────┴─────┴───────┘
hstack( columns: list[Series] | DataFrame, *, in_place: bool = False, ) → DataFrame-
Вставляет Series (или выражение) по заданному индексу столбца.
Операция выполняется на месте.
- Параметры:
-
- index
-
Индекс, по которому нужно вставить новый столбец.
- column
-
Seriesили выражение для вставки.
Примеры
Вставить столбец Series по заданному индексу:
>>> df = pl.DataFrame({"foo": [1, 2, 3], "bar": [4, 5, 6]}) >>> s = pl.Series("baz", [97, 98, 99]) >>> df.insert_column(1, s) shape: (3, 3) ┌─────┬─────┬─────┐ │ foo ┆ baz ┆ bar │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ i64 │ ╞═════╪═════╪═════╡ │ 1 ┆ 97 ┆ 4 │ │ 2 ┆ 98 ┆ 5 │ │ 3 ┆ 99 ┆ 6 │ └─────┴─────┴─────┘Вставить столбец-выражение по заданному индексу:
>>> df = pl.DataFrame( ... {"a": [2, 4, 2], "b": [0.5, 4, 10], "c": ["xx", "yy", "zz"]} ... ) >>> expr = (pl.col("b") / pl.col("a")).alias("b_div_a") >>> df.insert_column(2, expr) shape: (3, 4) ┌─────┬──────┬─────────┬─────┐ │ a ┆ b ┆ b_div_a ┆ c │ │ --- ┆ --- ┆ --- ┆ --- │ │ i64 ┆ f64 ┆ f64 ┆ str │ ╞═════╪══════╪═════════╪═════╡ │ 2 ┆ 0.5 ┆ 0.25 ┆ xx │ │ 4 ┆ 4.0 ┆ 1.0 ┆ yy │ │ 2 ┆ 10.0 ┆ 5.0 ┆ zz │ └─────┴──────┴─────────┴─────┘
insert_column( index: int, column: IntoExprColumn, ) → DataFrame-
Интерполирует промежуточные значения линейным методом.
Значения null в начале и конце ряда остаются null.
Примеры
>>> df = pl.DataFrame( ... { ... "foo": [1, None, 9, 10], ... "bar": [6, 7, 9, None], ... "baz": [1, None, None, 9], ... } ... ) >>> df.interpolate() shape: (4, 3) ┌──────┬──────┬──────────┐ │ foo ┆ bar ┆ baz │ │ --- ┆ --- ┆ --- │ │ f64 ┆ f64 ┆ f64 │ ╞══════╪══════╪══════════╡ │ 1.0 ┆ 6.0 ┆ 1.0 │ │ 5.0 ┆ 7.0 ┆ 3.666667 │ │ 9.0 ┆ 9.0 ┆ 6.333333 │ │ 10.0 ┆ null ┆ 9.0 │ └──────┴──────┴──────────┘
interpolate() → DataFrame
-
Получает маску всех дублирующихся строк в этом DataFrame.
Примеры
>>> df = pl.DataFrame( ... { ... "a": [1, 2, 3, 1], ... "b": ["x", "y", "z", "x"], ... } ... ) >>> df.is_duplicated() shape: (4,) Series: '' [bool] [ true false false true ]Эту маску можно использовать для визуализации дублирующихся строк следующим образом:
>>> df.filter(df.is_duplicated()) shape: (2, 2) ┌─────┬─────┐ │ a ┆ b │ │ --- ┆ --- │ │ i64 ┆ str │ ╞═════╪═════╡ │ 1 ┆ x │ │ 1 ┆ x │ └─────┴─────┘
is_duplicated() → Series
-
Возвращает
True, если DataFrame не содержит строк.Примеры
>>> df = pl.DataFrame({"foo": [1, 2, 3], "bar": [4, 5, 6]}) >>> df.is_empty() False >>> df.filter(pl.col("foo") > 99).is_empty() True
is_empty() → bool
-
Проверяет, отсортирован ли DataFrame по заданным столбцам.
- Параметры:
-
- by
-
Имя столбца или имена столбцов для проверки.
- *more_by
-
Дополнительные имена столбцов.
- descending
-
Сортировать по убыванию. При сортировке по нескольким столбцам можно задать отдельное логическое значение для каждого столбца, передав последовательность значений.
- nulls_last
-
Помещать значения null в конец. При сортировке по нескольким столбцам можно задать отдельное логическое значение для каждого столбца, передав последовательность значений.
Примеры
>>> df = pl.DataFrame({"a": [1, 2, 3], "b": [5, 4, 3]}) >>> df.is_sorted("a") True >>> df.is_sorted("b", descending=True) True >>> df.is_sorted("a", "b") True
is_sorted( by: str | Iterable[str], *more_by: str, descending: bool | Sequence[bool] = False, nulls_last: bool | Sequence[bool] = False, ) → bool-
Получает маску всех уникальных строк в этом DataFrame.
Примеры
>>> df = pl.DataFrame( ... { ... "a": [1, 2, 3, 1], ... "b": ["x", "y", "z", "x"], ... } ... ) >>> df.is_unique() shape: (4,) Series: '' [bool] [ false true true false ]Эту маску можно использовать для визуализации уникальных строк следующим образом:
>>> df.filter(df.is_unique()) shape: (2, 2) ┌─────┬─────┐ │ a ┆ b │ │ --- ┆ --- │ │ i64 ┆ str │ ╞═════╪═════╡ │ 2 ┆ y │ │ 3 ┆ z │ └─────┴─────┘
is_unique() → Series
-
Возвращает DataFrame в виде скалярного значения или элемент в заданной строке и столбце.
- Параметры:
-
- row
-
Необязательный индекс строки.
- column
-
Необязательный индекс или имя столбца.
См. также
-
row -
Получает значения одной строки по индексу или предикату.
Примечания
Если row/col не указаны, метод эквивалентен
df[0,0]с проверкой, что форма равна (1,1). Если row/col указаны, метод эквивалентенdf[row,col].Примеры
>>> df = pl.DataFrame({"a": [1, 2, 3], "b": [4, 5, 6]}) >>> df.select((pl.col("a") * pl.col("b")).sum()).item() 32 >>> df.item(1, 1) 5 >>> df.item(2, "b") 6
item( row: int | None = None, column: int | str | None = None, ) → Any-
Возвращает итератор по столбцам этого DataFrame.
- Генерирует:
-
- Series
Примечания
Подумайте, можно ли вместо этого использовать
all(). Если это возможно, такой вариант будет эффективнее.Примеры
>>> df = pl.DataFrame( ... { ... "a": [1, 3, 5], ... "b": [2, 4, 6], ... } ... ) >>> [s.name for s in df.iter_columns()] ['a', 'b']Если вы используете этот метод для изменения столбцов DataFrame, например:
>>> # Do NOT do this >>> pl.DataFrame(column * 2 for column in df.iter_columns()) shape: (3, 2) ┌─────┬─────┐ │ a ┆ b │ │ --- ┆ --- │ │ i64 ┆ i64 │ ╞═════╪═════╡ │ 2 ┆ 4 │ │ 6 ┆ 8 │ │ 10 ┆ 12 │ └─────┴─────┘
подумайте, можно ли вместо этого использовать
all():>>> df.select(pl.all() * 2) shape: (3, 2) ┌─────┬─────┐ │ a ┆ b │ │ --- ┆ --- │ │ i64 ┆ i64 │ ╞═════╪═════╡ │ 2 ┆ 4 │ │ 6 ┆ 8 │ │ 10 ┆ 12 │ └─────┴─────┘
iter_columns() → Iterator[Series]
-
Возвращает итератор по строкам DataFrame, представленным значениями в типах Python.
- Параметры:
-
- named
-
Возвращать словари вместо кортежей. Словари сопоставляют имена столбцов со значениями строк. Это затратнее, чем возврат обычного кортежа, но позволяет обращаться к значениям по имени столбца.
- buffer_size
-
Определяет количество строк, буферизуемых внутри при переборе данных. Изменяйте это значение только в особых случаях, когда значение по умолчанию не подходит для вашего способа доступа к данным: буферизация значительно повышает скорость (примерно в 2–4 раза). Если задать ноль, буферизация строк отключится (не рекомендуется).
- Генерирует:
-
- итератор кортежей (по умолчанию) или словарей (если задано named) со значениями строк в типах Python
Предупреждение
Перебор строк не оптимален, поскольку исходные данные хранятся в столбцовом формате. По возможности используйте один из специализированных методов экспорта или вывода, работающих со столбцовыми данными.
См. также
-
rows -
Материализует все данные фрейма в виде списка строк (может быть затратным).
-
rows_by_key -
Материализует данные фрейма в виде словаря с индексом по ключам.
Примечания
Если вы работаете с временными значениями точности
ns, учитывайте, что Python изначально поддерживает точность только доμs; при преобразовании в Python значения точностиnsбудут усечены до микросекунд. Если это важно для вашего случая использования, экспортируйте данные в другой формат (например, Arrow или NumPy).Примеры
>>> df = pl.DataFrame( ... { ... "a": [1, 3, 5], ... "b": [2, 4, 6], ... } ... ) >>> [row[0] for row in df.iter_rows()] [1, 3, 5] >>> [row["b"] for row in df.iter_rows(named=True)] [2, 4, 6]
iter_rows( *, named: bool = False, buffer_size: int = 512, ) → Iterator[tuple[Any, ...]] | Iterator[dict[str, Any]]-
Возвращает итератор неперекрывающихся срезов исходного DataFrame без копирования данных.
- Параметры:
-
- n_rows
-
Определяет количество строк в каждом срезе DataFrame.
См. также
-
iter_rows -
Итератор по строкам данных фрейма (не материализует все строки).
-
partition_by -
Разбивает DataFrame на несколько частей, сгруппированных по группам.
Примеры
>>> from datetime import date >>> df = pl.DataFrame( ... data={ ... "a": range(17_500), ... "b": date(2023, 1, 1), ... "c": "klmnoopqrstuvwxyz", ... }, ... schema_overrides={"a": pl.Int32}, ... ) >>> for idx, frame in enumerate(df.iter_slices()): ... print(f"{type(frame).__name__}:[{idx}]:{len(frame)}") DataFrame:[0]:10000 DataFrame:[1]:7500Использование
iter_slices— эффективный способ перебирать DataFrame частями и экспортировать или преобразовывать фрейм в любой поддерживаемый формат; например, в RecordBatches:>>> for frame in df.iter_slices(n_rows=15_000): ... record_batch = frame.to_arrow().to_batches()[0] ... print(f"{record_batch.schema}\n<< {len(record_batch)}") a: int32 b: date32[day] c: large_string << 15000 a: int32 b: date32[day] c: large_string << 2500
iter_slices( n_rows: int = 10000, ) → Iterator[DataFrame]-
-
Объединяет таблицы в стиле SQL.
Изменено в версии 1.24: Параметр
join_nullsпереименован вnulls_equal.- Параметры:
-
- other
-
DataFrame для объединения.
- on
-
Имя или имена столбцов для объединения в обоих DataFrame. Если задано,
left_onиright_onдолжны иметь значение None. Не следует указывать, если задан параметрhow='cross'. -
how{‘inner’, ‘left’, ‘right’, ‘full’, ‘semi’, ‘anti’, ‘cross’} -
Стратегия объединения.
inner
(По умолчанию) Возвращает строки, содержащие совпадающие значения в обеих таблицах.
left
Возвращает все строки из левой таблицы и соответствующие им строки из правой таблицы.
right
Возвращает все строки из правой таблицы и соответствующие им строки из левой таблицы.
full
Возвращает все строки из обеих таблиц, объединяя совпадающие строки и заполняя несовпадающие значения значениями null.
cross
Возвращает декартово произведение строк обеих таблиц.
semi
Возвращает строки из левой таблицы, для которых есть совпадения в правой таблице. Столбцы из правой таблицы не возвращаются.
anti
Возвращает строки из левой таблицы, для которых нет совпадений в правой таблице. Столбцы из правой таблицы не возвращаются.
- left_on
-
Имя или имена столбцов для объединения в левой таблице.
- right_on
-
Имя или имена столбцов для объединения в правой таблице.
- suffix
-
Суффикс, добавляемый к столбцам с повторяющимися именами.
- validate: {‘m:m’, ‘m:1’, ‘1:m’, ‘1:1’}
-
Проверяет, соответствует ли объединение указанному типу.
m:m
(По умолчанию) «Многие ко многим» (по умолчанию). Проверки не выполняются.
1:1
«Один к одному». Проверяет уникальность ключей объединения в обоих наборах данных.
1:m
«Один ко многим». Проверяет уникальность ключей объединения в левом наборе данных.
m:1
«Многие к одному». Проверяет уникальность ключей объединения в правом наборе данных.
Примечание
В настоящее время эта возможность не поддерживается потоковым движком.
- nulls_equal
-
Объединять по значениям null. По умолчанию значения null никогда не считаются совпадающими.
- coalesce
-
Поведение коалесценции (объединения столбцов для объединения).
None
(По умолчанию) Выполнять коалесценцию, если не указан
how='full'.True
Всегда объединять столбцы для объединения.
False
Никогда не объединять столбцы для объединения.
Примечание
Объединение по любым выражениям, кроме
col, отключает коалесценцию. -
maintain_order{‘none’, ‘left’, ‘right’, ‘left_right’, ‘right_left’} -
Порядок строк какого DataFrame следует сохранить, если это необходимо. Не полагайтесь на наблюдаемый порядок без явной установки этого параметра: ваш код может перестать работать в будущем выпуске. Отказ от указания порядка может повысить производительность.
none
(По умолчанию) Определённый порядок не требуется. Порядок может различаться в разных версиях Polars или даже при разных запусках.
left
Сохраняет порядок строк левого DataFrame.
right
Сохраняет порядок строк правого DataFrame.
left_right
Сначала сохраняет порядок левого DataFrame, затем правого.
right_left
Сначала сохраняет порядок правого DataFrame, затем левого.
- build_side: {‘auto’, ‘prefer_left’, ‘prefer_right’, ‘force_left’, ‘force_right’}
-
Сторона объединения, используемая в качестве строящей стороны. Вероятно, эта сторона будет храниться в памяти в виде хеш-таблицы. Если не выбран вариант
force_, выбранная сторона может различаться в разных версиях Polars или даже при разных запусках.auto
(По умолчанию) Предоставить Polars выбор строящей стороны.
prefer_left
Использовать левую сторону, если нет веских причин считать, что правая сторона меньше.
prefer_right
Использовать правую сторону, если нет веских причин считать, что левая сторона меньше.
force_left
Всегда использовать левую сторону.
force_right
Всегда использовать правую сторону.
Предупреждение
Эта функциональность считается экспериментальной. Она может быть удалена или изменена в любой момент без того, чтобы это считалось несовместимым изменением.
См. также
Примеры
>>> df = pl.DataFrame( ... { ... "foo": [1, 2, 3], ... "bar": [6.0, 7.0, 8.0], ... "ham": ["a", "b", "c"], ... } ... ) >>> other_df = pl.DataFrame( ... { ... "apple": ["x", "y", "z"], ... "ham": ["a", "b", "d"], ... } ... ) >>> df.join(other_df, on="ham") shape: (2, 4) ┌─────┬─────┬─────┬───────┐ │ foo ┆ bar ┆ ham ┆ apple │ │ --- ┆ --- ┆ --- ┆ --- │ │ i64 ┆ f64 ┆ str ┆ str │ ╞═════╪═════╪═════╪═══════╡ │ 1 ┆ 6.0 ┆ a ┆ x │ │ 2 ┆ 7.0 ┆ b ┆ y │ └─────┴─────┴─────┴───────┘>>> df.join(other_df, on="ham", how="full") shape: (4, 5) ┌──────┬──────┬──────┬───────┬───────────┐ │ foo ┆ bar ┆ ham ┆ apple ┆ ham_right │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ i64 ┆ f64 ┆ str ┆ str ┆ str │ ╞══════╪══════╪══════╪═══════╪═══════════╡ │ 1 ┆ 6.0 ┆ a ┆ x ┆ a │ │ 2 ┆ 7.0 ┆ b ┆ y ┆ b │ │ null ┆ null ┆ null ┆ z ┆ d │ │ 3 ┆ 8.0 ┆ c ┆ null ┆ null │ └──────┴──────┴──────┴───────┴───────────┘
>>> df.join(other_df, on="ham", how="full", coalesce=True) shape: (4, 4) ┌──────┬──────┬─────┬───────┐ │ foo ┆ bar ┆ ham ┆ apple │ │ --- ┆ --- ┆ --- ┆ --- │ │ i64 ┆ f64 ┆ str ┆ str │ ╞══════╪══════╪═════╪═══════╡ │ 1 ┆ 6.0 ┆ a ┆ x │ │ 2 ┆ 7.0 ┆ b ┆ y │ │ null ┆ null ┆ d ┆ z │ │ 3 ┆ 8.0 ┆ c ┆ null │ └──────┴──────┴─────┴───────┘
>>> df.join(other_df, on="ham", how="left") shape: (3, 4) ┌─────┬─────┬─────┬───────┐ │ foo ┆ bar ┆ ham ┆ apple │ │ --- ┆ --- ┆ --- ┆ --- │ │ i64 ┆ f64 ┆ str ┆ str │ ╞═════╪═════╪═════╪═══════╡ │ 1 ┆ 6.0 ┆ a ┆ x │ │ 2 ┆ 7.0 ┆ b ┆ y │ │ 3 ┆ 8.0 ┆ c ┆ null │ └─────┴─────┴─────┴───────┘
>>> df.join(other_df, on="ham", how="semi") shape: (2, 3) ┌─────┬─────┬─────┐ │ foo ┆ bar ┆ ham │ │ --- ┆ --- ┆ --- │ │ i64 ┆ f64 ┆ str │ ╞═════╪═════╪═════╡ │ 1 ┆ 6.0 ┆ a │ │ 2 ┆ 7.0 ┆ b │ └─────┴─────┴─────┘
>>> df.join(other_df, on="ham", how="anti") shape: (1, 3) ┌─────┬─────┬─────┐ │ foo ┆ bar ┆ ham │ │ --- ┆ --- ┆ --- │ │ i64 ┆ f64 ┆ str │ ╞═════╪═════╪═════╡ │ 3 ┆ 8.0 ┆ c │ └─────┴─────┴─────┘
>>> df.join(other_df, how="cross") shape: (9, 5) ┌─────┬─────┬─────┬───────┬───────────┐ │ foo ┆ bar ┆ ham ┆ apple ┆ ham_right │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ i64 ┆ f64 ┆ str ┆ str ┆ str │ ╞═════╪═════╪═════╪═══════╪═══════════╡ │ 1 ┆ 6.0 ┆ a ┆ x ┆ a │ │ 1 ┆ 6.0 ┆ a ┆ y ┆ b │ │ 1 ┆ 6.0 ┆ a ┆ z ┆ d │ │ 2 ┆ 7.0 ┆ b ┆ x ┆ a │ │ 2 ┆ 7.0 ┆ b ┆ y ┆ b │ │ 2 ┆ 7.0 ┆ b ┆ z ┆ d │ │ 3 ┆ 8.0 ┆ c ┆ x ┆ a │ │ 3 ┆ 8.0 ┆ c ┆ y ┆ b │ │ 3 ┆ 8.0 ┆ c ┆ z ┆ d │ └─────┴─────┴─────┴───────┴───────────┘
join( other: DataFrame, on: str | Expr | Sequence[str | Expr] | None = None, how: JoinStrategy = 'inner', *, left_on: str | Expr | Sequence[str | Expr] | None = None, right_on: str | Expr | Sequence[str | Expr] | None = None, suffix: str = '_right', validate: JoinValidation = 'm:m', nulls_equal: bool = False, coalesce: bool | None = None, maintain_order: MaintainOrderJoin | None = None, build_side: JoinBuildSide = 'auto', ) → DataFrame-
Выполняет объединение по принципу asof.
Оно похоже на левое объединение, за исключением того, что совпадение ищется по ближайшему ключу, а не по равным ключам.
Оба DataFrame должны быть отсортированы по ключу
on(в каждой группеby, если она указана).Для каждой строки левого DataFrame:
- При поиске «назад» выбирается последняя строка правого DataFrame, ключ ‘on’ которой меньше или равен ключу левой строки.
- При поиске «вперёд» выбирается первая строка правого DataFrame, ключ ‘on’ которой больше или равен ключу левой строки.
- При поиске «ближайшего» выбирается последняя строка правого DataFrame, значение которой ближе всего к ключу левой строки. Поиск ближайшего значения по строковым ключам в настоящее время не поддерживается.
По умолчанию используется поиск «назад».
- Параметры:
-
- other
-
Ленивый DataFrame для объединения.
- left_on
-
Столбец объединения левого DataFrame.
- right_on
-
Столбец объединения правого DataFrame.
- on
-
Столбец объединения обоих DataFrame. Если задано,
left_onиright_onдолжны иметь значение None. - by_left
-
Сначала выполнить объединение по этим столбцам, а затем объединение asof.
- by_right
-
Сначала выполнить объединение по этим столбцам, а затем объединение asof.
- by
-
Сначала выполнить объединение по этим столбцам, а затем объединение asof.
-
strategy{‘backward’, ‘forward’, ‘nearest’} -
Стратегия объединения.
- suffix
-
Суффикс, добавляемый к столбцам с повторяющимися именами.
- tolerance
-
Числовой допуск. Если задан этот параметр, объединение будет выполнено, только если близкие ключи находятся в пределах указанного расстояния. При выполнении объединения asof по столбцам типа “Date”, “Datetime”, “Duration” или “Time” используйте объект datetime.timedelta либо следующую строковую запись:
- 1ns (1 наносекунда)
- 1us (1 микросекунда)
- 1ms (1 миллисекунда)
- 1s (1 секунда)
- 1m (1 минута)
- 1h (1 час)
- 1d (1 календарный день)
- 1w (1 календарная неделя)
- 1mo (1 календарный месяц)
- 1q (1 календарный квартал)
- 1y (1 календарный год)
Или объедините их: “3d12h4m25s” # 3 дня, 12 часов, 4 минуты и 25 секунд
Под «календарным днём» подразумевается соответствующее время следующего дня (который может длиться не 24 часа из-за перехода на летнее время; в неоднозначных случаях мы следуем RFC-5545 и сохраняем переход DST исходной даты и времени). То же относится к «календарной неделе», «календарному месяцу», «календарному кварталу» и «календарному году».
- allow_parallel
-
Разрешить физическому плану при необходимости вычислять данные обоих DataFrame до этапа объединения параллельно.
- force_parallel
-
Предписать физическому плану вычислять данные обоих DataFrame до этапа объединения параллельно.
- coalesce
-
Поведение коалесценции (объединения столбцов
on/left_on/right_on):- True: Всегда объединять столбцы для объединения.
- False: Никогда не объединять столбцы для объединения.
Обратите внимание: объединение по любым выражениям, кроме
col, отключает коалесценцию. - allow_exact_matches
-
Допустимы ли точные совпадения в качестве предикатов объединения.
-
-
If True, allow matching with the same on value -
(то есть меньше или равно / больше или равно)
-
-
-
If False, don’t match the same on value -
(то есть строго меньше / строго больше).
-
-
- check_sortedness
-
Проверяет сортировку ключей asof. Если ключи не отсортированы, Polars выдаст ошибку. В настоящее время движок
in-memoryне может проверить сортировку, если указаны группы ‘by’. Движокstreamingпроверяет сортировку только обрабатываемых им строк.
См. также
Примеры
>>> from datetime import date >>> gdp = pl.DataFrame( ... { ... "date": pl.date_range( ... date(2016, 1, 1), ... date(2020, 1, 1), ... "1y", ... eager=True, ... ), ... "gdp": [4164, 4411, 4566, 4696, 4827], ... } ... ) >>> gdp shape: (5, 2) ┌────────────┬──────┐ │ date ┆ gdp │ │ --- ┆ --- │ │ date ┆ i64 │ ╞════════════╪══════╡ │ 2016-01-01 ┆ 4164 │ │ 2017-01-01 ┆ 4411 │ │ 2018-01-01 ┆ 4566 │ │ 2019-01-01 ┆ 4696 │ │ 2020-01-01 ┆ 4827 │ └────────────┴──────┘>>> population = pl.DataFrame( ... { ... "date": [date(2016, 3, 1), date(2018, 8, 1), date(2019, 1, 1)], ... "population": [82.19, 82.66, 83.12], ... } ... ).sort("date") >>> population shape: (3, 2) ┌────────────┬────────────┐ │ date ┆ population │ │ --- ┆ --- │ │ date ┆ f64 │ ╞════════════╪════════════╡ │ 2016-03-01 ┆ 82.19 │ │ 2018-08-01 ┆ 82.66 │ │ 2019-01-01 ┆ 83.12 │ └────────────┴────────────┘Обратите внимание, что даты не совсем совпадают. Если объединить их с помощью
join_asofиstrategy='backward', каждая дата изpopulation, для которой нет точного совпадения, будет сопоставлена с ближайшей более ранней датой изgdp:>>> population.join_asof(gdp, on="date", strategy="backward") shape: (3, 3) ┌────────────┬────────────┬──────┐ │ date ┆ population ┆ gdp │ │ --- ┆ --- ┆ --- │ │ date ┆ f64 ┆ i64 │ ╞════════════╪════════════╪══════╡ │ 2016-03-01 ┆ 82.19 ┆ 4164 │ │ 2018-08-01 ┆ 82.66 ┆ 4566 │ │ 2019-01-01 ┆ 83.12 ┆ 4696 │ └────────────┴────────────┴──────┘
Обратите внимание:
- дата
2016-03-01изpopulationсопоставляется с2016-01-01изgdp; - дата
2018-08-01изpopulationсопоставляется с2018-01-01изgdp.
Это можно проверить, передав
coalesce=False:>>> population.join_asof(gdp, on="date", strategy="backward", coalesce=False) shape: (3, 4) ┌────────────┬────────────┬────────────┬──────┐ │ date ┆ population ┆ date_right ┆ gdp │ │ --- ┆ --- ┆ --- ┆ --- │ │ date ┆ f64 ┆ date ┆ i64 │ ╞════════════╪════════════╪════════════╪══════╡ │ 2016-03-01 ┆ 82.19 ┆ 2016-01-01 ┆ 4164 │ │ 2018-08-01 ┆ 82.66 ┆ 2018-01-01 ┆ 4566 │ │ 2019-01-01 ┆ 83.12 ┆ 2019-01-01 ┆ 4696 │ └────────────┴────────────┴────────────┴──────┘
Если вместо этого использовать
strategy='forward', каждая дата изpopulation, для которой нет точного совпадения, будет сопоставлена с ближайшей более поздней датой изgdp:>>> population.join_asof(gdp, on="date", strategy="forward") shape: (3, 3) ┌────────────┬────────────┬──────┐ │ date ┆ population ┆ gdp │ │ --- ┆ --- ┆ --- │ │ date ┆ f64 ┆ i64 │ ╞════════════╪════════════╪══════╡ │ 2016-03-01 ┆ 82.19 ┆ 4411 │ │ 2018-08-01 ┆ 82.66 ┆ 4696 │ │ 2019-01-01 ┆ 83.12 ┆ 4696 │ └────────────┴────────────┴──────┘
Обратите внимание:
- дата
2016-03-01изpopulationсопоставляется с2017-01-01изgdp; - дата
2018-08-01изpopulationсопоставляется с2019-01-01изgdp.
Наконец,
strategy='nearest'даёт сочетание двух приведённых выше результатов: каждая дата изpopulation, для которой нет точного совпадения, сопоставляется с ближайшей датой изgdp, независимо от того, раньше она или позже:>>> population.join_asof(gdp, on="date", strategy="nearest") shape: (3, 3) ┌────────────┬────────────┬──────┐ │ date ┆ population ┆ gdp │ │ --- ┆ --- ┆ --- │ │ date ┆ f64 ┆ i64 │ ╞════════════╪════════════╪══════╡ │ 2016-03-01 ┆ 82.19 ┆ 4164 │ │ 2018-08-01 ┆ 82.66 ┆ 4696 │ │ 2019-01-01 ┆ 83.12 ┆ 4696 │ └────────────┴────────────┴──────┘
Обратите внимание:
- дата
2016-03-01изpopulationсопоставляется с2016-01-01изgdp; - дата
2018-08-01изpopulationсопоставляется с2019-01-01изgdp.
Аргумент
byпозволяет сначала выполнить объединение по другому столбцу, а затем объединение asof. В этом примере сначала выполняется объединение поcountry, а затем, как и выше, объединение asof по дате.>>> gdp_dates = pl.date_range( # fmt: skip ... date(2016, 1, 1), date(2020, 1, 1), "1y", eager=True ... ) >>> gdp2 = pl.DataFrame( ... { ... "country": ["Germany"] * 5 + ["Netherlands"] * 5, ... "date": pl.concat([gdp_dates, gdp_dates]), ... "gdp": [4164, 4411, 4566, 4696, 4827, 784, 833, 914, 910, 909], ... } ... ).sort("country", "date") >>> >>> gdp2 shape: (10, 3) ┌─────────────┬────────────┬──────┐ │ country ┆ date ┆ gdp │ │ --- ┆ --- ┆ --- │ │ str ┆ date ┆ i64 │ ╞═════════════╪════════════╪══════╡ │ Germany ┆ 2016-01-01 ┆ 4164 │ │ Germany ┆ 2017-01-01 ┆ 4411 │ │ Germany ┆ 2018-01-01 ┆ 4566 │ │ Germany ┆ 2019-01-01 ┆ 4696 │ │ Germany ┆ 2020-01-01 ┆ 4827 │ │ Netherlands ┆ 2016-01-01 ┆ 784 │ │ Netherlands ┆ 2017-01-01 ┆ 833 │ │ Netherlands ┆ 2018-01-01 ┆ 914 │ │ Netherlands ┆ 2019-01-01 ┆ 910 │ │ Netherlands ┆ 2020-01-01 ┆ 909 │ └─────────────┴────────────┴──────┘ >>> pop2 = pl.DataFrame( ... { ... "country": ["Germany"] * 3 + ["Netherlands"] * 3, ... "date": [ ... date(2016, 3, 1), ... date(2018, 8, 1), ... date(2019, 1, 1), ... date(2016, 3, 1), ... date(2018, 8, 1), ... date(2019, 1, 1), ... ], ... "population": [82.19, 82.66, 83.12, 17.11, 17.32, 17.40], ... } ... ).sort("country", "date") >>> >>> pop2 shape: (6, 3) ┌─────────────┬────────────┬────────────┐ │ country ┆ date ┆ population │ │ --- ┆ --- ┆ --- │ │ str ┆ date ┆ f64 │ ╞═════════════╪════════════╪════════════╡ │ Germany ┆ 2016-03-01 ┆ 82.19 │ │ Germany ┆ 2018-08-01 ┆ 82.66 │ │ Germany ┆ 2019-01-01 ┆ 83.12 │ │ Netherlands ┆ 2016-03-01 ┆ 17.11 │ │ Netherlands ┆ 2018-08-01 ┆ 17.32 │ │ Netherlands ┆ 2019-01-01 ┆ 17.4 │ └─────────────┴────────────┴────────────┘ >>> pop2.join_asof(gdp2, by="country", on="date", strategy="nearest") shape: (6, 4) ┌─────────────┬────────────┬────────────┬──────┐ │ country ┆ date ┆ population ┆ gdp │ │ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ date ┆ f64 ┆ i64 │ ╞═════════════╪════════════╪════════════╪══════╡ │ Germany ┆ 2016-03-01 ┆ 82.19 ┆ 4164 │ │ Germany ┆ 2018-08-01 ┆ 82.66 ┆ 4696 │ │ Germany ┆ 2019-01-01 ┆ 83.12 ┆ 4696 │ │ Netherlands ┆ 2016-03-01 ┆ 17.11 ┆ 784 │ │ Netherlands ┆ 2018-08-01 ┆ 17.32 ┆ 910 │ │ Netherlands ┆ 2019-01-01 ┆ 17.4 ┆ 910 │ └─────────────┴────────────┴────────────┴──────┘
join_asof( other: DataFrame, *, left_on: str | None | Expr = None, right_on: str | None | Expr = None, on: str | None | Expr = None, by_left: str | Sequence[str] | None = None, by_right: str | Sequence[str] | None = None, by: str | Sequence[str] | None = None, strategy: AsofJoinStrategy = 'backward', suffix: str = '_right', tolerance: str | int | float | timedelta | None = None, allow_parallel: bool = True, force_parallel: bool = False, coalesce: bool = True, allow_exact_matches: bool = True, check_sortedness: bool = True, ) → DataFrame-
Выполняет объединение на основе одного или нескольких предикатов равенства/неравенства.
Примечание
Порядок строк исходных DataFrame не сохраняется.
Предупреждение
Эта функциональность является экспериментальной. Она может быть изменена в любой момент без того, чтобы это считалось несовместимым изменением.
- Параметры:
-
- other
-
DataFrame для объединения.
- *predicates
-
Условие равенства/неравенства для объединения двух таблиц. Если имя столбца встречается в обеих таблицах, в предикате необходимо использовать соответствующий суффикс.
-
how{‘inner’, ‘left’, ‘right’} -
Стратегия объединения.
- suffix
-
Суффикс, добавляемый к столбцам с повторяющимися именами.
Примеры
Объедините два DataFrame по двум предикатам, связанным оператором AND.
>>> east = pl.DataFrame( ... { ... "id": [100, 101, 102], ... "dur": [120, 140, 160], ... "rev": [12, 14, 16], ... "cores": [2, 8, 4], ... } ... ) >>> west = pl.DataFrame( ... { ... "t_id": [404, 498, 676, 742], ... "time": [90, 130, 150, 170], ... "cost": [9, 13, 15, 16], ... "cores": [4, 2, 1, 4], ... } ... ) >>> east.join_where( ... west, ... pl.col("dur") < pl.col("time"), ... pl.col("rev") < pl.col("cost"), ... ) shape: (5, 8) ┌─────┬─────┬─────┬───────┬──────┬──────┬──────┬─────────────┐ │ id ┆ dur ┆ rev ┆ cores ┆ t_id ┆ time ┆ cost ┆ cores_right │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ i64 ┆ i64 ┆ i64 ┆ i64 ┆ i64 ┆ i64 │ ╞═════╪═════╪═════╪═══════╪══════╪══════╪══════╪═════════════╡ │ 100 ┆ 120 ┆ 12 ┆ 2 ┆ 498 ┆ 130 ┆ 13 ┆ 2 │ │ 100 ┆ 120 ┆ 12 ┆ 2 ┆ 676 ┆ 150 ┆ 15 ┆ 1 │ │ 100 ┆ 120 ┆ 12 ┆ 2 ┆ 742 ┆ 170 ┆ 16 ┆ 4 │ │ 101 ┆ 140 ┆ 14 ┆ 8 ┆ 676 ┆ 150 ┆ 15 ┆ 1 │ │ 101 ┆ 140 ┆ 14 ┆ 8 ┆ 742 ┆ 170 ┆ 16 ┆ 4 │ └─────┴─────┴─────┴───────┴──────┴──────┴──────┴─────────────┘Чтобы связать их оператором OR, используйте одно выражение и оператор
|.>>> east.join_where( ... west, ... (pl.col("dur") < pl.col("time")) | (pl.col("rev") < pl.col("cost")), ... ) shape: (6, 8) ┌─────┬─────┬─────┬───────┬──────┬──────┬──────┬─────────────┐ │ id ┆ dur ┆ rev ┆ cores ┆ t_id ┆ time ┆ cost ┆ cores_right │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ i64 ┆ i64 ┆ i64 ┆ i64 ┆ i64 ┆ i64 │ ╞═════╪═════╪═════╪═══════╪══════╪══════╪══════╪═════════════╡ │ 100 ┆ 120 ┆ 12 ┆ 2 ┆ 498 ┆ 130 ┆ 13 ┆ 2 │ │ 100 ┆ 120 ┆ 12 ┆ 2 ┆ 676 ┆ 150 ┆ 15 ┆ 1 │ │ 100 ┆ 120 ┆ 12 ┆ 2 ┆ 742 ┆ 170 ┆ 16 ┆ 4 │ │ 101 ┆ 140 ┆ 14 ┆ 8 ┆ 676 ┆ 150 ┆ 15 ┆ 1 │ │ 101 ┆ 140 ┆ 14 ┆ 8 ┆ 742 ┆ 170 ┆ 16 ┆ 4 │ │ 102 ┆ 160 ┆ 16 ┆ 4 ┆ 742 ┆ 170 ┆ 16 ┆ 4 │ └─────┴─────┴─────┴───────┴──────┴──────┴──────┴─────────────┘Передайте
how="left", чтобы дополнительно сохранить строки левой таблицы без совпадений, установив для столбцов правой таблицы значениеnull.>>> east.join_where( ... west, ... pl.col("dur") < pl.col("time"), ... pl.col("rev") < pl.col("cost"), ... how="left", ... ) shape: (6, 8) ┌─────┬─────┬─────┬───────┬──────┬──────┬──────┬─────────────┐ │ id ┆ dur ┆ rev ┆ cores ┆ t_id ┆ time ┆ cost ┆ cores_right │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ i64 ┆ i64 ┆ i64 ┆ i64 ┆ i64 ┆ i64 │ ╞═════╪═════╪═════╪═══════╪══════╪══════╪══════╪═════════════╡ │ 100 ┆ 120 ┆ 12 ┆ 2 ┆ 498 ┆ 130 ┆ 13 ┆ 2 │ │ 100 ┆ 120 ┆ 12 ┆ 2 ┆ 676 ┆ 150 ┆ 15 ┆ 1 │ │ 100 ┆ 120 ┆ 12 ┆ 2 ┆ 742 ┆ 170 ┆ 16 ┆ 4 │ │ 101 ┆ 140 ┆ 14 ┆ 8 ┆ 676 ┆ 150 ┆ 15 ┆ 1 │ │ 101 ┆ 140 ┆ 14 ┆ 8 ┆ 742 ┆ 170 ┆ 16 ┆ 4 │ │ 102 ┆ 160 ┆ 16 ┆ 4 ┆ null ┆ null ┆ null ┆ null │ └─────┴─────┴─────┴───────┴──────┴──────┴──────┴─────────────┘
join_where( other: DataFrame, *predicates: Expr | Iterable[Expr], how: JoinWhereStrategy = 'inner', suffix: str = '_right', ) → DataFrame-
Начинает ленивый запрос с этой точки. Возвращает объект
LazyFrame.Операции над
LazyFrameне выполняются, пока выполнение не будет запущено вызовом одного из методов:-
-
.collect() -
(выполнить для всех данных)
-
-
-
.explain() -
(вывести план запроса)
-
-
-
.show_graph() -
(показать план запроса в виде графа graphviz)
-
-
-
.collect_schema() -
(вернуть схему результирующего фрейма)
-
Рекомендуется использовать ленивые операции, поскольку они позволяют оптимизировать запросы и обеспечивают дополнительный параллелизм.
- Возвращает:
-
- LazyFrame
Примеры
>>> df = pl.DataFrame( ... { ... "a": [None, 2, 3, 4], ... "b": [0.5, None, 2.5, 13], ... "c": [True, True, False, None], ... } ... ) >>> df.lazy() <LazyFrame at ...> -
lazy() → LazyFrame
-
Получает первые
nстрок.Псевдоним для
DataFrame.head().- Параметры:
-
- n
-
Количество возвращаемых строк. Если передано отрицательное значение, возвращаются все строки, кроме последних
abs(n).
См. также
Примеры
Получение первых 3 строк DataFrame.
>>> df = pl.DataFrame( ... { ... "foo": [1, 2, 3, 4, 5], ... "bar": [6, 7, 8, 9, 10], ... "ham": ["a", "b", "c", "d", "e"], ... } ... ) >>> df.limit(3) shape: (3, 3) ┌─────┬─────┬─────┐ │ foo ┆ bar ┆ ham │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ str │ ╞═════╪═════╪═════╡ │ 1 ┆ 6 ┆ a │ │ 2 ┆ 7 ┆ b │ │ 3 ┆ 8 ┆ c │ └─────┴─────┴─────┘
limit( n: int = 5, ) → DataFrame-
Применяет функции с немедленным выполнением к столбцам DataFrame.
Пользователям всегда следует предпочитать
with_columns(), если только они не используют выражения, применимые только кSeries, но не кExpr. Такое бывает почти никогда, за исключением нескольких функций, тип выходных данных которых невозможно определить без анализа самих данных.- Параметры:
-
- column_names
-
Столбцы, к которым нужно применить UDF.
- function
-
Вызываемый объект; первым параметром получает серию столбца, а затем любые переданные args/kwargs.
- *args
-
Аргументы, передаваемые UDF.
- **kwargs
-
Именованные аргументы, передаваемые UDF.
См. также
Примеры
>>> df = pl.DataFrame({"a": [1, 2, 3, 4], "b": ["10", "20", "30", "40"]}) >>> df.map_columns("a", lambda s: s.shrink_dtype()) shape: (4, 2) ┌─────┬─────┐ │ a ┆ b │ │ --- ┆ --- │ │ i8 ┆ str │ ╞═════╪═════╡ │ 1 ┆ 10 │ │ 2 ┆ 20 │ │ 3 ┆ 30 │ │ 4 ┆ 40 │ └─────┴─────┘>>> df = pl.DataFrame( ... { ... "a": ['{"x":"a"}', None, '{"x":"b"}', None], ... "b": ['{"a":1, "b": true}', None, '{"a":2, "b": false}', None], ... } ... ) >>> df.map_columns(["a", "b"], lambda s: s.str.json_decode()) shape: (4, 2) ┌───────────┬───────────┐ │ a ┆ b │ │ --- ┆ --- │ │ struct[1] ┆ struct[2] │ ╞═══════════╪═══════════╡ │ {"a"} ┆ {1,true} │ │ null ┆ null │ │ {"b"} ┆ {2,false} │ │ null ┆ null │ └───────────┴───────────┘ >>> import polars.selectors as cs >>> df.map_columns(cs.all(), lambda s: s.str.json_decode()) shape: (4, 2) ┌───────────┬───────────┐ │ a ┆ b │ │ --- ┆ --- │ │ struct[1] ┆ struct[2] │ ╞═══════════╪═══════════╡ │ {"a"} ┆ {1,true} │ │ null ┆ null │ │ {"b"} ┆ {2,false} │ │ null ┆ null │ └───────────┴───────────┘
map_columns( column_names: str | Sequence[str] | Selector, function: Callable[Concatenate[Series, P], Series], *args: P.args, **kwargs: P.kwargs, ) → DataFrame-
Применяет пользовательскую функцию (UDF) к строкам DataFrame.
Предупреждение
Этот метод значительно медленнее API встроенных выражений. Используйте его, только если невозможно реализовать логику другим способом.
UDF получает каждую строку в виде кортежа значений:
udf(row).Реализация логики с помощью функции Python почти всегда значительно медленнее и требует больше памяти, чем реализация той же логики с помощью API встроенных выражений, поскольку:
- Механизм встроенных выражений работает на Rust; UDF выполняются на Python.
- Использование UDF на Python требует загрузки DataFrame в память.
- Встроенные выражения Polars можно выполнять параллельно (UDF — как правило, нельзя).
- Встроенные выражения Polars можно логически оптимизировать (UDF — нельзя).
Для достижения наилучшей производительности настоятельно рекомендуется по возможности использовать API встроенных выражений.
- Параметры:
-
- function
-
Пользовательская функция или лямбда-функция.
- return_dtype
-
Тип результата операции. Если не задан, Polars попытается определить тип автоматически.
- inference_size
-
Используется только в случае, если пользовательская функция возвращает строки. Для определения выходной схемы используются первые
nстрок.
Примечания
- Метод
map_rowsуровня фрейма не может отслеживать имена столбцов (так как UDF — это «чёрный ящик», который может произвольно удалять, переставлять, преобразовывать столбцы или добавлять новые); если необходимо применить UDF с сохранением имён столбцов, используйте синтаксисmap_elementsуровня выражений. - Если функция ресурсоёмкая и вы не хотите, чтобы она вызывалась более одного раза для одних и тех же входных данных, рассмотрите возможность применения к ней декоратора
@lru_cache. Если ваши данные подходят для этого, можно добиться значительного ускорения.
Примеры
>>> df = pl.DataFrame({"foo": [1, 2, 3], "bar": [-1, 5, 8]})Возвращает DataFrame, преобразуя каждую строку в кортеж:
>>> df.map_rows(lambda t: (t[0] * 2, t[1] * 3)) shape: (3, 2) ┌──────────┬──────────┐ │ column_0 ┆ column_1 │ │ --- ┆ --- │ │ i64 ┆ i64 │ ╞══════════╪══════════╡ │ 2 ┆ -3 │ │ 4 ┆ 15 │ │ 6 ┆ 24 │ └──────────┴──────────┘
Однако гораздо лучше реализовать это с помощью встроенного выражения:
>>> df.select( ... pl.col("foo") * 2, ... pl.col("bar") * 3, ... )Возвращает DataFrame с одним столбцом, преобразуя каждую строку в скалярное значение:
>>> df.map_rows(lambda t: t[0] * 2 + t[1]) shape: (3, 1) ┌─────┐ │ map │ │ --- │ │ i64 │ ╞═════╡ │ 1 │ │ 9 │ │ 14 │ └─────┘
В этом случае лучше использовать следующее встроенное выражение:
>>> df.select(pl.col("foo") * 2 + pl.col("bar"))
map_rows( function: Callable[[tuple[Any, ...]], Any], return_dtype: PolarsDataType | None = None, *, inference_size: int = 256, ) → DataFrame-
Приводит схему LazyFrame к заданной схеме или адаптирует её к ней.
По умолчанию match_to_schema возвращает ошибку, если входная схема не совпадает с целевой схемой в точности. При этом столбцы можно свободно переупорядочивать; дополнительные правила приведения типов доступны через необязательные параметры.
Предупреждение
Эта функциональность считается нестабильной. Она может быть изменена в любой момент без того, чтобы это считалось несовместимым изменением.
- Параметры:
-
- schema
-
Целевая схема, которой нужно соответствовать или к которой нужно привести данные.
- missing_columns
-
Вызывает ошибку или добавляет отсутствующие во входных данных столбцы в соответствии с
schema.Также можно указать выражение для каждого столбца, которое задаёт значение для вставки, если столбец отсутствует.
- missing_struct_fields
-
Вызывает ошибку или добавляет отсутствующие во входных данных поля структуры в соответствии с
schema. - extra_columns
-
Вызывает ошибку или игнорирует лишние входные столбцы в соответствии с
schema. - extra_struct_fields
-
Вызывает ошибку или игнорирует лишние входные поля структуры в соответствии с
schema. - integer_cast
-
Запрещает повышающее преобразование целочисленных столбцов из входных данных к соответствующим столбцам в
schema. - float_cast
-
Запрещает повышающее преобразование столбцов с плавающей точкой из входных данных к соответствующим столбцам в
schema.
Примеры
Проверка соответствия схемы
>>> df = pl.DataFrame({"a": [1, 2, 3], "b": ["A", "B", "C"]}) >>> df.match_to_schema({"a": pl.Int64, "b": pl.String}) shape: (3, 2) ┌─────┬─────┐ │ a ┆ b │ │ --- ┆ --- │ │ i64 ┆ str │ ╞═════╪═════╡ │ 1 ┆ A │ │ 2 ┆ B │ │ 3 ┆ C │ └─────┴─────┘ >>> df.match_to_schema({"a": pl.Int64}) polars.exceptions.SchemaError: extra columns in `match_to_schema`: "b"Добавление отсутствующих столбцов
>>> ( ... pl.DataFrame({"a": [1, 2, 3]}).match_to_schema( ... {"a": pl.Int64, "b": pl.String}, ... missing_columns="insert", ... ) ... ) shape: (3, 2) ┌─────┬──────┐ │ a ┆ b │ │ --- ┆ --- │ │ i64 ┆ str │ ╞═════╪══════╡ │ 1 ┆ null │ │ 2 ┆ null │ │ 3 ┆ null │ └─────┴──────┘ >>> ( ... pl.DataFrame({"a": [1, 2, 3]}).match_to_schema( ... {"a": pl.Int64, "b": pl.String}, ... missing_columns={"b": pl.col.a.cast(pl.String)}, ... ) ... ) shape: (3, 2) ┌─────┬─────┐ │ a ┆ b │ │ --- ┆ --- │ │ i64 ┆ str │ ╞═════╪═════╡ │ 1 ┆ 1 │ │ 2 ┆ 2 │ │ 3 ┆ 3 │ └─────┴─────┘Удаление лишних столбцов
>>> ( ... pl.DataFrame({"a": [1, 2, 3], "b": ["A", "B", "C"]}).match_to_schema( ... {"a": pl.Int64}, ... extra_columns="ignore", ... ) ... ) shape: (3, 1) ┌─────┐ │ a │ │ --- │ │ i64 │ ╞═════╡ │ 1 │ │ 2 │ │ 3 │ └─────┘Повышающее преобразование целых чисел и чисел с плавающей точкой
>>> ( ... pl.DataFrame( ... {"a": [1, 2, 3], "b": [1.0, 2.0, 3.0]}, ... schema={"a": pl.Int32, "b": pl.Float32}, ... ).match_to_schema( ... {"a": pl.Int64, "b": pl.Float64}, ... integer_cast="upcast", ... float_cast="upcast", ... ) ... ) shape: (3, 2) ┌─────┬─────┐ │ a ┆ b │ │ --- ┆ --- │ │ i64 ┆ f64 │ ╞═════╪═════╡ │ 1 ┆ 1.0 │ │ 2 ┆ 2.0 │ │ 3 ┆ 3.0 │ └─────┴─────┘
match_to_schema( schema: SchemaDict | Schema, *, missing_columns: Literal['insert', 'raise'] | Mapping[str, Literal['insert', 'raise'] | Expr] = 'raise', missing_struct_fields: Literal['insert', 'raise'] | Mapping[str, Literal['insert', 'raise']] = 'raise', extra_columns: Literal['ignore', 'raise'] = 'raise', extra_struct_fields: Literal['ignore', 'raise'] | Mapping[str, Literal['ignore', 'raise']] = 'raise', integer_cast: Literal['upcast', 'forbid'] | Mapping[str, Literal['upcast', 'forbid']] = 'forbid', float_cast: Literal['upcast', 'forbid'] | Mapping[str, Literal['upcast', 'forbid']] = 'forbid', ) → DataFrame-
Агрегирует столбцы этого DataFrame, вычисляя их максимальные значения.
Примеры
>>> df = pl.DataFrame( ... { ... "foo": [1, 2, 3], ... "bar": [6, 7, 8], ... "ham": ["a", "b", "c"], ... } ... ) >>> df.max() shape: (1, 3) ┌─────┬─────┬─────┐ │ foo ┆ bar ┆ ham │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ str │ ╞═════╪═════╪═════╡ │ 3 ┆ 8 ┆ c │ └─────┴─────┴─────┘
max() → DataFrame
-
Вычисляет максимальное значение по горизонтали для всех столбцов.
- Возвращает:
-
- Series
-
Series с именем
"max".
Примеры
>>> df = pl.DataFrame( ... { ... "foo": [1, 2, 3], ... "bar": [4.0, 5.0, 6.0], ... } ... ) >>> df.max_horizontal() shape: (3,) Series: 'max' [f64] [ 4.0 5.0 6.0 ]
max_horizontal() → Series
-
Агрегирует столбцы этого DataFrame, вычисляя их средние значения.
Примеры
>>> df = pl.DataFrame( ... { ... "foo": [1, 2, 3], ... "bar": [6, 7, 8], ... "ham": ["a", "b", "c"], ... "spam": [True, False, None], ... } ... ) >>> df.mean() shape: (1, 4) ┌─────┬─────┬──────┬──────┐ │ foo ┆ bar ┆ ham ┆ spam │ │ --- ┆ --- ┆ --- ┆ --- │ │ f64 ┆ f64 ┆ str ┆ f64 │ ╞═════╪═════╪══════╪══════╡ │ 2.0 ┆ 7.0 ┆ null ┆ 0.5 │ └─────┴─────┴──────┴──────┘
mean() → DataFrame
-
Вычисляет среднее значение по горизонтали для всех значений в столбцах.
- Параметры:
-
- ignore_nulls
-
Игнорировать значения null (по умолчанию). Если задано значение
False, любое значение null во входных данных приведёт к результату null.
- Возвращает:
-
- Series
-
Series с именем
"mean".
Примеры
>>> df = pl.DataFrame( ... { ... "foo": [1, 2, 3], ... "bar": [4.0, 5.0, 6.0], ... } ... ) >>> df.mean_horizontal() shape: (3,) Series: 'mean' [f64] [ 2.5 3.5 4.5 ]
mean_horizontal( *, ignore_nulls: bool = True, ) → Series-
Агрегирует столбцы этого DataFrame, вычисляя их медианные значения.
Примеры
>>> df = pl.DataFrame( ... { ... "foo": [1, 2, 3], ... "bar": [6, 7, 8], ... "ham": ["a", "b", "c"], ... } ... ) >>> df.median() shape: (1, 3) ┌─────┬─────┬──────┐ │ foo ┆ bar ┆ ham │ │ --- ┆ --- ┆ --- │ │ f64 ┆ f64 ┆ str │ ╞═════╪═════╪══════╡ │ 2.0 ┆ 7.0 ┆ null │ └─────┴─────┴──────┘
median() → DataFrame
-
Преобразует DataFrame из широкого формата в длинный.
При необходимости оставляет идентификаторы неизменными.
Эта функция полезна для преобразования DataFrame в формат, где один или несколько столбцов являются переменными-идентификаторами (id_vars), а все остальные столбцы, рассматриваемые как измеряемые переменные (value_vars), «разворачиваются» в строки, оставляя только два столбца, не являющихся идентификаторами: ‘variable’ и ‘value’.
Устарело начиная с версии 1.0.0: Вместо этого используйте метод
unpivot().- Параметры:
-
- id_vars
-
Столбец или столбцы либо селектор или селекторы, используемые в качестве переменных-идентификаторов.
- value_vars
-
Столбец или столбцы либо селектор или селекторы, используемые в качестве переменных-значений; если
value_varsпуст, будут использованы все столбцы, отсутствующие вid_vars. - variable_name
-
Имя столбца
variable. По умолчанию — “variable”. - value_name
-
Имя столбца
value. По умолчанию — “value”.
melt( id_vars: ColumnNameOrSelector | Sequence[ColumnNameOrSelector] | None = None, value_vars: ColumnNameOrSelector | Sequence[ColumnNameOrSelector] | None = None, variable_name: str | None = None, value_name: str | None = None, ) → DataFrame-
Объединяет два отсортированных DataFrame по отсортированному ключу.
Результат этой операции также будет отсортирован. Вызывающий код должен обеспечить сортировку фреймов по ключу или ключам в порядке возрастания, поместив ключи null в начало; в противном случае порядок результата будет некорректным.
Схемы обоих DataFrame должны совпадать.
- Параметры:
-
- other
-
Другой DataFrame, который необходимо объединить.
- key
-
Ключевой столбец или столбцы, по которым отсортированы фреймы. Можно передать одно имя столбца или последовательность имён столбцов. Если передано несколько ключей, фреймы объединяются так, как если бы они были отсортированы по этим ключам в указанном порядке.
- maintain_order
-
Если задано
True, для одинаковых ключей гарантируется порядок с приоритетом левого фрейма: строки левого фрейма следуют перед строками правого фрейма.
Примечания
Если не задано
maintain_order=True, порядок строк результата при одинаковых ключах не гарантируется.Ключи должны быть отсортированы по возрастанию.
Примеры
>>> df0 = pl.DataFrame( ... {"name": ["steve", "elise", "bob"], "age": [42, 44, 18]} ... ).sort("age") >>> df0 shape: (3, 2) ┌───────┬─────┐ │ name ┆ age │ │ --- ┆ --- │ │ str ┆ i64 │ ╞═══════╪═════╡ │ bob ┆ 18 │ │ steve ┆ 42 │ │ elise ┆ 44 │ └───────┴─────┘ >>> df1 = pl.DataFrame( ... {"name": ["anna", "megan", "steve", "thomas"], "age": [21, 33, 42, 20]} ... ).sort("age") >>> df1 shape: (4, 2) ┌────────┬─────┐ │ name ┆ age │ │ --- ┆ --- │ │ str ┆ i64 │ ╞════════╪═════╡ │ thomas ┆ 20 │ │ anna ┆ 21 │ │ megan ┆ 33 │ │ steve ┆ 42 │ └────────┴─────┘ >>> df0.merge_sorted(df1, key="age") shape: (7, 2) ┌────────┬─────┐ │ name ┆ age │ │ --- ┆ --- │ │ str ┆ i64 │ ╞════════╪═════╡ │ bob ┆ 18 │ │ thomas ┆ 20 │ │ anna ┆ 21 │ │ megan ┆ 33 │ │ steve ┆ 42 │ │ steve ┆ 42 │ │ elise ┆ 44 │ └────────┴─────┘Для объединения фреймов, отсортированных по составному ключу, можно передать несколько ключей. Фреймы объединяются так, как если бы они были отсортированы сначала по
key_1, а затем поkey_2.>>> df0 = pl.DataFrame({"key_1": [1, 1, 3], "key_2": [1, 4, 2]}) >>> df1 = pl.DataFrame({"key_1": [1, 2, 3], "key_2": [2, 1, 1]}) >>> df0.merge_sorted(df1, key=["key_1", "key_2"]) shape: (6, 2) ┌───────┬───────┐ │ key_1 ┆ key_2 │ │ --- ┆ --- │ │ i64 ┆ i64 │ ╞═══════╪═══════╡ │ 1 ┆ 1 │ │ 1 ┆ 2 │ │ 1 ┆ 4 │ │ 2 ┆ 1 │ │ 3 ┆ 1 │ │ 3 ┆ 2 │ └───────┴───────┘
merge_sorted( other: DataFrame, key: str | Sequence[str], *, maintain_order: bool = False, ) → DataFrame-
Агрегирует столбцы этого DataFrame, вычисляя их минимальные значения.
Примеры
>>> df = pl.DataFrame( ... { ... "foo": [1, 2, 3], ... "bar": [6, 7, 8], ... "ham": ["a", "b", "c"], ... } ... ) >>> df.min() shape: (1, 3) ┌─────┬─────┬─────┐ │ foo ┆ bar ┆ ham │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ str │ ╞═════╪═════╪═════╡ │ 1 ┆ 6 ┆ a │ └─────┴─────┴─────┘
min() → DataFrame
-
Вычисляет минимальное значение по горизонтали для всех столбцов.
- Возвращает:
-
- Series
-
Series с именем
"min".
Примеры
>>> df = pl.DataFrame( ... { ... "foo": [1, 2, 3], ... "bar": [4.0, 5.0, 6.0], ... } ... ) >>> df.min_horizontal() shape: (3,) Series: 'min' [f64] [ 1.0 2.0 3.0 ]
min_horizontal() → Series
-
Возвращает количество фрагментов, используемых ChunkedArrays этого DataFrame.
- Параметры:
-
-
strategy{‘first’, ‘all’} -
Возвращает количество фрагментов для «первого» столбца или для «всех» столбцов этого DataFrame.
-
Примеры
>>> df = pl.DataFrame( ... { ... "a": [1, 2, 3, 4], ... "b": [0.5, 4, 10, 13], ... "c": [True, True, False, True], ... } ... ) >>> df.n_chunks() 1 >>> df.n_chunks(strategy="all") [1, 1, 1]
n_chunks( strategy: Literal['first', 'all'] = 'first', ) → int | list[int]-
-
Возвращает количество уникальных строк или количество уникальных подмножеств строк.
- Параметры:
-
- subset
-
Один или несколько столбцов/выражений, определяющих, что подсчитывать; опустите параметр, чтобы вернуть количество уникальных строк.
Примечания
Этот метод работает на уровне
DataFrame; чтобы работать с подмножествами на уровне выражений, можно вместо этого использовать упаковку в структуры, например:>>> expr_unique_subset = pl.struct("a", "b").n_unique()Если же вы хотите подсчитать количество уникальных значений в каждом столбце, можно также использовать синтаксис уровня выражений и вернуть новый фрейм с результатом:
>>> df = pl.DataFrame( ... [[1, 2, 3], [1, 2, 4]], schema=["a", "b", "c"], orient="row" ... ) >>> df_nunique = df.select(pl.all().n_unique())
В контексте агрегации также есть эквивалентный метод для возврата уникальных значений в каждой группе:
>>> df_agg_nunique = df.group_by("a").n_unique()Примеры
>>> df = pl.DataFrame( ... { ... "a": [1, 1, 2, 3, 4, 5], ... "b": [0.5, 0.5, 1.0, 2.0, 3.0, 3.0], ... "c": [True, True, True, False, True, True], ... } ... ) >>> df.n_unique() 5Подмножество из обычных столбцов.
>>> df.n_unique(subset=["b", "c"]) 4
Подмножество из выражений.
>>> df.n_unique( ... subset=[ ... (pl.col("a") // 2), ... (pl.col("c") | (pl.col("b") >= 2)), ... ], ... ) 3
n_unique( subset: str | Expr | Sequence[str | Expr] | None = None, ) → int-
Создаёт новый DataFrame, отображающий количество null-значений в каждом столбце.
Примеры
>>> df = pl.DataFrame( ... { ... "foo": [1, None, 3], ... "bar": [6, 7, None], ... "ham": ["a", "b", "c"], ... } ... ) >>> df.null_count() shape: (1, 3) ┌─────┬─────┬─────┐ │ foo ┆ bar ┆ ham │ │ --- ┆ --- ┆ --- │ │ u32 ┆ u32 ┆ u32 │ ╞═════╪═════╪═════╡ │ 1 ┆ 1 ┆ 0 │ └─────┴─────┴─────┘
null_count() → DataFrame
-
Группирует данные по указанным столбцам и возвращает группы в виде отдельных датафреймов.
- Параметры:
-
- by
-
Имя (имена) столбца или селектор (селекторы) для группировки.
- *more_by
-
Дополнительные имена столбцов для группировки, заданные как позиционные аргументы.
- maintain_order
-
Обеспечивает порядок групп, соответствующий порядку во входных данных. Это медленнее, чем стандартная операция разбиения на разделы.
- include_key
-
Включает в результат столбцы, использованные для разбиения DataFrame на разделы.
- as_dict
-
Возвращает словарь вместо списка. Ключи словаря — кортежи уникальных значений групп, идентифицирующие каждую группу.
Примеры
Передайте имя одного столбца, чтобы разбить данные по этому столбцу.
>>> df = pl.DataFrame( ... { ... "a": ["a", "b", "a", "b", "c"], ... "b": [1, 2, 1, 3, 3], ... "c": [5, 4, 3, 2, 1], ... } ... ) >>> df.partition_by("a") [shape: (2, 3) ┌─────┬─────┬─────┐ │ a ┆ b ┆ c │ │ --- ┆ --- ┆ --- │ │ str ┆ i64 ┆ i64 │ ╞═════╪═════╪═════╡ │ a ┆ 1 ┆ 5 │ │ a ┆ 1 ┆ 3 │ └─────┴─────┴─────┘, shape: (2, 3) ┌─────┬─────┬─────┐ │ a ┆ b ┆ c │ │ --- ┆ --- ┆ --- │ │ str ┆ i64 ┆ i64 │ ╞═════╪═════╪═════╡ │ b ┆ 2 ┆ 4 │ │ b ┆ 3 ┆ 2 │ └─────┴─────┴─────┘, shape: (1, 3) ┌─────┬─────┬─────┐ │ a ┆ b ┆ c │ │ --- ┆ --- ┆ --- │ │ str ┆ i64 ┆ i64 │ ╞═════╪═════╪═════╡ │ c ┆ 3 ┆ 1 │ └─────┴─────┴─────┘]Чтобы разбить данные по нескольким столбцам, передайте список имён столбцов или укажите каждое имя столбца как позиционный аргумент.
>>> df.partition_by("a", "b") [shape: (2, 3) ┌─────┬─────┬─────┐ │ a ┆ b ┆ c │ │ --- ┆ --- ┆ --- │ │ str ┆ i64 ┆ i64 │ ╞═════╪═════╪═════╡ │ a ┆ 1 ┆ 5 │ │ a ┆ 1 ┆ 3 │ └─────┴─────┴─────┘, shape: (1, 3) ┌─────┬─────┬─────┐ │ a ┆ b ┆ c │ │ --- ┆ --- ┆ --- │ │ str ┆ i64 ┆ i64 │ ╞═════╪═════╪═════╡ │ b ┆ 2 ┆ 4 │ └─────┴─────┴─────┘, shape: (1, 3) ┌─────┬─────┬─────┐ │ a ┆ b ┆ c │ │ --- ┆ --- ┆ --- │ │ str ┆ i64 ┆ i64 │ ╞═════╪═════╪═════╡ │ b ┆ 3 ┆ 2 │ └─────┴─────┴─────┘, shape: (1, 3) ┌─────┬─────┬─────┐ │ a ┆ b ┆ c │ │ --- ┆ --- ┆ --- │ │ str ┆ i64 ┆ i64 │ ╞═════╪═════╪═════╡ │ c ┆ 3 ┆ 1 │ └─────┴─────┴─────┘]Чтобы вернуть разделы в виде словаря, укажите
as_dict=True.>>> import polars.selectors as cs >>> df.partition_by(cs.string(), as_dict=True) {('a',): shape: (2, 3) ┌─────┬─────┬─────┐ │ a ┆ b ┆ c │ │ --- ┆ --- ┆ --- │ │ str ┆ i64 ┆ i64 │ ╞═════╪═════╪═════╡ │ a ┆ 1 ┆ 5 │ │ a ┆ 1 ┆ 3 │ └─────┴─────┴─────┘, ('b',): shape: (2, 3) ┌─────┬─────┬─────┐ │ a ┆ b ┆ c │ │ --- ┆ --- ┆ --- │ │ str ┆ i64 ┆ i64 │ ╞═════╪═════╪═════╡ │ b ┆ 2 ┆ 4 │ │ b ┆ 3 ┆ 2 │ └─────┴─────┴─────┘, ('c',): shape: (1, 3) ┌─────┬─────┬─────┐ │ a ┆ b ┆ c │ │ --- ┆ --- ┆ --- │ │ str ┆ i64 ┆ i64 │ ╞═════╪═════╪═════╡ │ c ┆ 3 ┆ 1 │ └─────┴─────┴─────┘}
partition_by( by: ColumnNameOrSelector | Sequence[ColumnNameOrSelector], *more_by: ColumnNameOrSelector, maintain_order: bool = True, include_key: bool = True, as_dict: bool = False, ) → list[DataFrame] | dict[tuple[Any, ...], DataFrame]-
Предоставляет структурированный способ применения последовательности пользовательских функций (UDF).
- Параметры:
-
- function
-
Вызываемый объект; получит фрейм в качестве первого параметра, за которым следуют переданные аргументы args/kwargs.
- *args
-
Аргументы, передаваемые UDF.
- **kwargs
-
Именованные аргументы, передаваемые UDF.
Примечания
При объединении операций в цепочку рекомендуется использовать LazyFrame, чтобы в полной мере воспользоваться оптимизацией запросов и параллельным выполнением. См.
df.lazy().Примеры
>>> def cast_str_to_int(data, col_name): ... return data.with_columns(pl.col(col_name).cast(pl.Int64)) >>> df = pl.DataFrame({"a": [1, 2, 3, 4], "b": ["10", "20", "30", "40"]}) >>> df.pipe(cast_str_to_int, col_name="b") shape: (4, 2) ┌─────┬─────┐ │ a ┆ b │ │ --- ┆ --- │ │ i64 ┆ i64 │ ╞═════╪═════╡ │ 1 ┆ 10 │ │ 2 ┆ 20 │ │ 3 ┆ 30 │ │ 4 ┆ 40 │ └─────┴─────┘>>> df = pl.DataFrame({"b": [1, 2], "a": [3, 4]}) >>> df shape: (2, 2) ┌─────┬─────┐ │ b ┆ a │ │ --- ┆ --- │ │ i64 ┆ i64 │ ╞═════╪═════╡ │ 1 ┆ 3 │ │ 2 ┆ 4 │ └─────┴─────┘ >>> df.pipe(lambda tdf: tdf.select(sorted(tdf.columns))) shape: (2, 2) ┌─────┬─────┐ │ a ┆ b │ │ --- ┆ --- │ │ i64 ┆ i64 │ ╞═════╪═════╡ │ 3 ┆ 1 │ │ 4 ┆ 2 │ └─────┴─────┘
pipe( function: Callable[Concatenate[DataFrame, P], T], *args: P.args, **kwargs: P.kwargs, ) → T-
Создаёт сводную таблицу в стиле электронных таблиц в виде DataFrame.
Доступно только в eager-режиме. В разделе «Примеры» ниже описано, как выполнить «ленивое преобразование» (lazy pivot), если заранее известны уникальные значения столбцов.
Изменено в версии 1.0.0: Параметр
columnsпереименован вon.- Параметры:
-
- on
-
Столбец (столбцы), значения которого будут использоваться в качестве новых столбцов выходного DataFrame.
- on_columns
-
Какие комбинации значений будут учитываться в выходной таблице.
- index
-
Столбец (столбцы), сохраняемый из входных данных в выходных. В выходном DataFrame будет по одной строке для каждой уникальной комбинации значений
index. Если задано None, будут использованы все остальные столбцы, не указанные вonиvalues. Необходимо указать хотя бы один из параметровindexиvalues. - values
-
Существующий столбец (столбцы) со значениями, которые будут перенесены в новые столбцы из index. Если указана агрегация, она будет вычисляться по этим значениям. Если задано None, будут использованы все остальные столбцы, не указанные в
onиindex. Необходимо указать хотя бы один из параметровindexиvalues. - aggregate_function
-
Выберите один из вариантов:
- None: агрегация не выполняется; если в группе несколько значений, будет вызвана ошибка.
- Предопределённая строка с функцией агрегации из набора {‘min’, ‘max’, ‘first’, ‘last’, ‘sum’, ‘mean’, ‘median’, ‘len’}
- Выражение для выполнения агрегации. Выражение может обращаться только к данным соответствующих столбцов ‘values’, созданных в результате сводного преобразования, через
pl.element().
- maintain_order
-
Обеспечивает сортировку значений
indexв порядке их обнаружения. - sort_columns
-
Сортирует транспонированные столбцы по имени. По умолчанию они упорядочены по порядку обнаружения.
- separator
-
Используется в качестве разделителя в именах создаваемых столбцов, если имеется несколько столбцов
values. -
column_naming{‘auto’, ‘combine’} -
Определяет способ формирования имён результирующих столбцов.
-
- ‘auto’: значение по умолчанию; если столбцов несколько, объединяет их с помощью разделителя
-
столбцы
values, в противном случае использует только именаon_columns.
-
-
‘combine’: Always combine the values columns’ names with -
имена
on_columns.
-
Предупреждение
Эта функциональность считается нестабильной. Она может быть изменена в любой момент, и такие изменения не будут считаться нарушающими совместимость.
-
- Возвращает:
-
- DataFrame
См. также
Примечания
В некоторых других фреймворках эта операция может называться
pivot_wider.Примеры
С помощью
pivotможно преобразовать датафрейм из «длинного» формата в «широкий».Например, предположим, что у нас есть датафрейм с результатами тестов студентов, где каждая строка соответствует отдельному тесту.
>>> df = pl.DataFrame( ... { ... "name": ["Cady", "Cady", "Karen", "Karen"], ... "subject": ["maths", "physics", "maths", "physics"], ... "test_1": [98, 99, 61, 58], ... "test_2": [100, 100, 60, 60], ... } ... ) >>> df shape: (4, 4) ┌───────┬─────────┬────────┬────────┐ │ name ┆ subject ┆ test_1 ┆ test_2 │ │ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ str ┆ i64 ┆ i64 │ ╞═══════╪═════════╪════════╪════════╡ │ Cady ┆ maths ┆ 98 ┆ 100 │ │ Cady ┆ physics ┆ 99 ┆ 100 │ │ Karen ┆ maths ┆ 61 ┆ 60 │ │ Karen ┆ physics ┆ 58 ┆ 60 │ └───────┴─────────┴────────┴────────┘С помощью
pivotможно преобразовать данные так, чтобы для каждого студента была одна строка, для разных предметов — отдельные столбцы, а в качестве значений использовались результатыtest_1:>>> df.pivot("subject", index="name", values="test_1") shape: (2, 3) ┌───────┬───────┬─────────┐ │ name ┆ maths ┆ physics │ │ --- ┆ --- ┆ --- │ │ str ┆ i64 ┆ i64 │ ╞═══════╪═══════╪═════════╡ │ Cady ┆ 98 ┆ 99 │ │ Karen ┆ 61 ┆ 58 │ └───────┴───────┴─────────┘Если нужно выполнить сводное преобразование только по ограниченному набору значений
subjectили значенияsubjectуже известны заранее, их можно передать с помощью аргументаon_columns.>>> df.pivot( ... "subject", ... on_columns=["maths", "physics"], ... index="name", ... values="test_1", ... ) shape: (2, 3) ┌───────┬───────┬─────────┐ │ name ┆ maths ┆ physics │ │ --- ┆ --- ┆ --- │ │ str ┆ i64 ┆ i64 │ ╞═══════╪═══════╪═════════╡ │ Cady ┆ 98 ┆ 99 │ │ Karen ┆ 61 ┆ 58 │ └───────┴───────┴─────────┘
Можно использовать и селекторы — здесь в сводную таблицу включены все результаты тестов:
>>> import polars.selectors as cs >>> df.pivot("subject", values=cs.starts_with("test")) shape: (2, 5) ┌───────┬──────────────┬────────────────┬──────────────┬────────────────┐ │ name ┆ test_1_maths ┆ test_1_physics ┆ test_2_maths ┆ test_2_physics │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ i64 ┆ i64 ┆ i64 ┆ i64 │ ╞═══════╪══════════════╪════════════════╪══════════════╪════════════════╡ │ Cady ┆ 98 ┆ 99 ┆ 100 ┆ 100 │ │ Karen ┆ 61 ┆ 58 ┆ 60 ┆ 60 │ └───────┴──────────────┴────────────────┴──────────────┴────────────────┘Если в одной ячейке окажется несколько значений, можно указать способ их агрегации с помощью
aggregate_function:>>> df = pl.DataFrame( ... { ... "ix": [1, 1, 2, 2, 1, 2], ... "col": ["a", "a", "a", "a", "b", "b"], ... "foo": [0, 1, 2, 2, 7, 1], ... "bar": [0, 2, 0, 0, 9, 4], ... } ... ) >>> df.pivot("col", index="ix", aggregate_function="sum") shape: (2, 5) ┌─────┬───────┬───────┬───────┬───────┐ │ ix ┆ foo_a ┆ foo_b ┆ bar_a ┆ bar_b │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ i64 ┆ i64 ┆ i64 │ ╞═════╪═══════╪═══════╪═══════╪═══════╡ │ 1 ┆ 1 ┆ 7 ┆ 2 ┆ 9 │ │ 2 ┆ 4 ┆ 1 ┆ 0 ┆ 4 │ └─────┴───────┴───────┴───────┴───────┘Также можно передать пользовательскую функцию агрегации с помощью
polars.element():>>> df = pl.DataFrame( ... { ... "col1": ["a", "a", "a", "b", "b", "b"], ... "col2": ["x", "x", "x", "x", "y", "y"], ... "col3": [6, 7, 3, 2, 5, 7], ... } ... ) >>> df.pivot( ... "col2", ... index="col1", ... values="col3", ... aggregate_function=pl.element().tanh().mean(), ... ) shape: (2, 3) ┌──────┬──────────┬──────────┐ │ col1 ┆ x ┆ y │ │ --- ┆ --- ┆ --- │ │ str ┆ f64 ┆ f64 │ ╞══════╪══════════╪══════════╡ │ a ┆ 0.998347 ┆ null │ │ b ┆ 0.964028 ┆ 0.999954 │ └──────┴──────────┴──────────┘
pivot( on: ColumnNameOrSelector | Sequence[ColumnNameOrSelector], on_columns: Sequence[Any] | Series | DataFrame | None = None, *, index: ColumnNameOrSelector | Sequence[ColumnNameOrSelector] | None = None, values: ColumnNameOrSelector | Sequence[ColumnNameOrSelector] | None = None, aggregate_function: PivotAgg | Expr | None = None, maintain_order: bool = True, sort_columns: bool = False, separator: str = '_', column_naming: Literal['auto', 'combine'] = 'auto', ) → DataFrame-
Создаёт пространство имён для построения графиков.
Предупреждение
В настоящее время эта функциональность считается нестабильной. Она может быть изменена в любой момент, и такие изменения не будут считаться нарушающими совместимость.
Изменено в версии 1.6.0: В предыдущих версиях Polars для построения графиков использовался HvPlot. Чтобы восстановить прежнюю функциональность построения графиков, достаточно добавить
import hvplot.polarsв начало скрипта и заменитьdf.plotнаdf.hvplot.Polars не реализует логику построения графиков самостоятельно, а делегирует её библиотеке Altair:
-
df.plot.line(**kwargs)— сокращённая запись дляalt.Chart(df).mark_line(tooltip=True).encode(**kwargs).interactive() -
df.plot.point(**kwargs)— сокращённая запись дляalt.Chart(df).mark_point(tooltip=True).encode(**kwargs).interactive()(аplot.scatterпредоставляется как псевдоним) -
df.plot.bar(**kwargs)— сокращённая запись дляalt.Chart(df).mark_bar(tooltip=True).encode(**kwargs).interactive() - для любого другого атрибута
attr,df.plot.attr(**kwargs)— сокращённая запись дляalt.Chart(df).mark_attr(tooltip=True).encode(**kwargs).interactive()
Информацию о настройке можно найти в разделе Настройка диаграмм. Например, можно:
- Изменить ширину, высоту и заголовок с помощью
.properties(width=500, height=350, title="My amazing plot"). - Изменить угол поворота подписи оси x с помощью
.configure_axisX(labelAngle=30). - Изменить непрозрачность точек на точечной диаграмме с помощью
.configure_point(opacity=.5).
Примеры
Точечная диаграмма:
>>> df = pl.DataFrame( ... { ... "length": [1, 4, 6], ... "width": [4, 5, 6], ... "species": ["setosa", "setosa", "versicolor"], ... } ... ) >>> df.plot.point(x="length", y="width", color="species")Задать заголовок оси x с помощью
altair.X:>>> import altair as alt >>> df.plot.point( ... x=alt.X("length", title="Length"), y="width", color="species" ... )Линейный график:
>>> from datetime import date >>> df = pl.DataFrame( ... { ... "date": [date(2020, 1, 2), date(2020, 1, 3), date(2020, 1, 4)] * 2, ... "price": [1, 4, 6, 1, 5, 2], ... "stock": ["a", "a", "a", "b", "b", "b"], ... } ... ) >>> df.plot.line(x="date", y="price", color="stock")Столбчатая диаграмма:
>>> df = pl.DataFrame( ... { ... "day": ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"] * 2, ... "group": ["a"] * 7 + ["b"] * 7, ... "value": [1, 3, 2, 4, 5, 6, 1, 1, 3, 2, 4, 5, 1, 2], ... } ... ) >>> df.plot.bar( ... x="day", y="value", color="day", column="group" ... )Или создать вариант приведённой выше диаграммы с накоплением:
>>> df.plot.bar(x="day", y="value", color="group")
-
property plot: DataFramePlot
-
Агрегирует столбцы этого DataFrame, вычисляя их произведение.
Примеры
>>> df = pl.DataFrame( ... { ... "a": [1, 2, 3], ... "b": [0.5, 4, 10], ... "c": [True, True, False], ... } ... )>>> df.product() shape: (1, 3) ┌─────┬──────┬─────┐ │ a ┆ b ┆ c │ │ --- ┆ --- ┆ --- │ │ i64 ┆ f64 ┆ i64 │ ╞═════╪══════╪═════╡ │ 6 ┆ 20.0 ┆ 0 │ └─────┴──────┴─────┘
product() → DataFrame
-
Агрегирует столбцы этого DataFrame, вычисляя их квантиль.
- Параметры:
-
- quantile
-
Квантиль от 0.0 до 1.0.
-
interpolation{‘nearest’, ‘higher’, ‘lower’, ‘midpoint’, ‘linear’, ‘equiprobable’} -
Метод интерполяции.
Примеры
>>> df = pl.DataFrame( ... { ... "foo": [1, 2, 3], ... "bar": [6, 7, 8], ... "ham": ["a", "b", "c"], ... } ... ) >>> df.quantile(0.5, "nearest") shape: (1, 3) ┌─────┬─────┬──────┐ │ foo ┆ bar ┆ ham │ │ --- ┆ --- ┆ --- │ │ f64 ┆ f64 ┆ str │ ╞═════╪═════╪══════╡ │ 2.0 ┆ 7.0 ┆ null │ └─────┴─────┴──────┘
quantile( quantile: float, interpolation: QuantileMethod = 'nearest', ) → DataFrame-
Перераспределяет данные этого DataFrame в непрерывный блок памяти.
Это обеспечивает оптимальную и предсказуемую производительность всех последующих операций.
rechunk() → DataFrame
-
Удаляет строки, соответствующие заданному выражению (выражениям) предиката.
Исходный порядок оставшихся строк сохраняется.
Строки, для которых условие фильтрации не вычисляется как True, сохраняются (в том числе строки, для которых условие вычисляется как
null).- Параметры:
-
- predicates
-
Выражение (выражения), вычисляемое в логический Series. Если передано несколько предикатов, они объединяются с помощью
&(логическое И), поэтому строка удаляется, только если каждый предикат для неё вычисляется как True. - constraints
-
Фильтры столбцов; используйте
name = value, чтобы фильтровать столбцы по заданному значению. Каждое ограничение работает так же, какpl.col(name).eq(value), и неявно объединяется с остальными условиями фильтрации с помощью&.
См. также
Примечания
Если вы переходите с Pandas и выполняете фильтрацию на основе сравнения двух или более столбцов, обратите внимание: в Polars любое сравнение, в котором участвуют значения
null, даст результатnull, а не логическое значение True или False. Поэтому такие строки не будут удалены. Обрабатывайте null-значения соответствующим образом, чтобы избежать неожиданного поведения (см. примеры ниже).Примеры
>>> df = pl.DataFrame( ... { ... "foo": [2, 3, None, 4, 0], ... "bar": [5, 6, None, None, 0], ... "ham": ["a", "b", None, "c", "d"], ... } ... )Удалить строки, соответствующие условию:
>>> df.remove(pl.col("bar") >= 5) shape: (3, 3) ┌──────┬──────┬──────┐ │ foo ┆ bar ┆ ham │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ str │ ╞══════╪══════╪══════╡ │ null ┆ null ┆ null │ │ 4 ┆ null ┆ c │ │ 0 ┆ 0 ┆ d │ └──────┴──────┴──────┘Отбросить строки по нескольким условиям, объединённым операторами И/ИЛИ:
>>> df.remove( ... (pl.col("foo") >= 0) & (pl.col("bar") >= 0), ... ) shape: (2, 3) ┌──────┬──────┬──────┐ │ foo ┆ bar ┆ ham │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ str │ ╞══════╪══════╪══════╡ │ null ┆ null ┆ null │ │ 4 ┆ null ┆ c │ └──────┴──────┴──────┘>>> df.remove( ... (pl.col("foo") >= 0) | (pl.col("bar") >= 0), ... ) shape: (1, 3) ┌──────┬──────┬──────┐ │ foo ┆ bar ┆ ham │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ str │ ╞══════╪══════╪══════╡ │ null ┆ null ┆ null │ └──────┴──────┴──────┘Задать несколько ограничений с помощью синтаксиса
*args:>>> df.remove( ... pl.col("ham").is_not_null(), ... pl.col("bar") >= 0, ... ) shape: (2, 3) ┌──────┬──────┬──────┐ │ foo ┆ bar ┆ ham │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ str │ ╞══════╪══════╪══════╡ │ null ┆ null ┆ null │ │ 4 ┆ null ┆ c │ └──────┴──────┴──────┘Задать ограничение (ограничения) с помощью синтаксиса
**kwargs:>>> df.remove(foo=0, bar=0) shape: (4, 3) ┌──────┬──────┬──────┐ │ foo ┆ bar ┆ ham │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ str │ ╞══════╪══════╪══════╡ │ 2 ┆ 5 ┆ a │ │ 3 ┆ 6 ┆ b │ │ null ┆ null ┆ null │ │ 4 ┆ null ┆ c │ └──────┴──────┴──────┘
Удалить строки, сравнив два столбца друг с другом:
>>> df.remove( ... pl.col("foo").ne_missing(pl.col("bar")), ... ) shape: (2, 3) ┌──────┬──────┬──────┐ │ foo ┆ bar ┆ ham │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ str │ ╞══════╪══════╪══════╡ │ null ┆ null ┆ null │ │ 0 ┆ 0 ┆ d │ └──────┴──────┴──────┘
remove( *predicates: IntoExprColumn | Iterable[IntoExprColumn] | bool | list[bool] | np.ndarray[Any, Any], **constraints: Any, ) → DataFrame-
Переименовывает столбцы.
- Параметры:
-
- mapping
-
Пары «ключ-значение», задающие соответствие старых имён новым, либо функция, принимающая старое имя и возвращающая новое.
- strict
-
Проверяет наличие всех имён столбцов в текущей схеме и вызывает исключение, если какие-либо из них отсутствуют. (Обратите внимание: этот параметр ничего не делает, если в
mappingпередана функция.)
См. также
Примеры
>>> df = pl.DataFrame( ... {"foo": [1, 2, 3], "bar": [6, 7, 8], "ham": ["a", "b", "c"]} ... ) >>> df.rename({"foo": "apple"}) shape: (3, 3) ┌───────┬─────┬─────┐ │ apple ┆ bar ┆ ham │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ str │ ╞═══════╪═════╪═════╡ │ 1 ┆ 6 ┆ a │ │ 2 ┆ 7 ┆ b │ │ 3 ┆ 8 ┆ c │ └───────┴─────┴─────┘ >>> df.rename(lambda column_name: "c" + column_name[1:]) shape: (3, 3) ┌─────┬─────┬─────┐ │ coo ┆ car ┆ cam │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ str │ ╞═════╪═════╪═════╡ │ 1 ┆ 6 ┆ a │ │ 2 ┆ 7 ┆ b │ │ 3 ┆ 8 ┆ c │ └─────┴─────┴─────┘
rename( mapping: Mapping[str, str] | Callable[[str], str], *, strict: bool = True, ) → DataFrame-
Заменяет столбец по указанному индексу.
Эта операция выполняется на месте.
- Параметры:
-
- index
-
Индекс столбца.
- column
-
Series, которым будет заменён столбец.
Примеры
>>> df = pl.DataFrame( ... { ... "foo": [1, 2, 3], ... "bar": [6, 7, 8], ... "ham": ["a", "b", "c"], ... } ... ) >>> s = pl.Series("apple", [10, 20, 30]) >>> df.replace_column(0, s) shape: (3, 3) ┌───────┬─────┬─────┐ │ apple ┆ bar ┆ ham │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ str │ ╞═══════╪═════╪═════╡ │ 10 ┆ 6 ┆ a │ │ 20 ┆ 7 ┆ b │ │ 30 ┆ 8 ┆ c │ └───────┴─────┴─────┘
replace_column( index: int, column: Series, ) → DataFrame-
Разворачивает DataFrame в обратном порядке.
Примеры
>>> df = pl.DataFrame( ... { ... "key": ["a", "b", "c"], ... "val": [1, 2, 3], ... } ... ) >>> df.reverse() shape: (3, 2) ┌─────┬─────┐ │ key ┆ val │ │ --- ┆ --- │ │ str ┆ i64 │ ╞═════╪═════╡ │ c ┆ 3 │ │ b ┆ 2 │ │ a ┆ 1 │ └─────┴─────┘
reverse() → DataFrame
-
Создаёт скользящие группы на основе временного столбца или столбца с целыми числами.
В отличие от
group_by_dynamic, окна теперь определяются отдельными значениями и не имеют постоянного интервала. Для постоянных интервалов используйтеDataFrame.group_by_dynamic().Если у вас есть временной ряд
<t_0, t_1, ..., t_n>, по умолчанию будут созданы следующие окна:- (t_0 - period, t_0]
- (t_1 - period, t_1]
- …
- (t_n - period, t_n]
Если же передать отличное от стандартного значение
offset, окна будут следующими:- (t_0 + offset, t_0 + offset + period]
- (t_1 + offset, t_1 + offset + period]
- …
- (t_n + offset, t_n + offset + period]
Аргументы
periodиoffsetсоздаются либо на основе timedelta, либо с помощью следующих строковых обозначений:- 1ns (1 наносекунда)
- 1us (1 микросекунда)
- 1ms (1 миллисекунда)
- 1s (1 секунда)
- 1m (1 минута)
- 1h (1 час)
- 1d (1 календарный день)
- 1w (1 календарная неделя)
- 1mo (1 календарный месяц)
- 1q (1 календарный квартал)
- 1y (1 календарный год)
- 1i (1 индексное значение)
Их также можно комбинировать: “3d12h4m25s” # 3 дня, 12 часов, 4 минуты и 25 секунд
Под «календарным днём» подразумевается соответствующее время следующего дня (который может длиться не 24 часа из-за перехода на летнее время). То же относится к «календарной неделе», «календарному месяцу», «календарному кварталу» и «календарному году».
Изменено в версии 0.20.14: Параметр
byпереименован вgroup_by.- Параметры:
-
- index_column
-
Столбец, используемый для группировки по временному окну. Часто имеет тип Date/Datetime. Этот столбец должен быть отсортирован по возрастанию (или, если указан
group_by, должен быть отсортирован по возрастанию внутри каждой группы).При скользящей операции над индексами тип данных должен быть одним из следующих: {UInt32, UInt64, Int32, Int64}. Обратите внимание: первые три типа временно приводятся к Int64, поэтому при необходимости высокой производительности используйте столбец Int64.
- period
-
Длина окна — должна быть неотрицательной.
- offset
-
Смещение окна. По умолчанию —
-period. -
closed{‘right’, ‘left’, ‘both’, ‘none’} -
Определяет, какие границы временного интервала включены.
- group_by
-
Также группирует данные по этому столбцу (столбцам).
- Возвращает:
-
- RollingGroupBy
-
Объект, для агрегации по группам которого можно вызвать
.agg. Результат будет отсортирован поindex_column(однако, если переданы столбцыgroup_by, сортировка будет выполняться только внутри каждой группы).
См. также
Примеры
>>> dates = [ ... "2020-01-01 13:45:48", ... "2020-01-01 16:42:13", ... "2020-01-01 16:45:09", ... "2020-01-02 18:12:48", ... "2020-01-03 19:45:32", ... "2020-01-08 23:16:43", ... ] >>> df = pl.DataFrame({"dt": dates, "a": [3, 7, 5, 9, 2, 1]}).with_columns( ... pl.col("dt").str.strptime(pl.Datetime).set_sorted() ... ) >>> out = df.rolling(index_column="dt", period="2d").agg( ... [ ... pl.sum("a").alias("sum_a"), ... pl.min("a").alias("min_a"), ... pl.max("a").alias("max_a"), ... ] ... ) >>> assert out["sum_a"].to_list() == [3, 10, 15, 24, 11, 1] >>> assert out["max_a"].to_list() == [3, 7, 7, 9, 9, 1] >>> assert out["min_a"].to_list() == [3, 3, 3, 3, 2, 1] >>> out shape: (6, 4) ┌─────────────────────┬───────┬───────┬───────┐ │ dt ┆ sum_a ┆ min_a ┆ max_a │ │ --- ┆ --- ┆ --- ┆ --- │ │ datetime[μs] ┆ i64 ┆ i64 ┆ i64 │ ╞═════════════════════╪═══════╪═══════╪═══════╡ │ 2020-01-01 13:45:48 ┆ 3 ┆ 3 ┆ 3 │ │ 2020-01-01 16:42:13 ┆ 10 ┆ 3 ┆ 7 │ │ 2020-01-01 16:45:09 ┆ 15 ┆ 3 ┆ 7 │ │ 2020-01-02 18:12:48 ┆ 24 ┆ 3 ┆ 9 │ │ 2020-01-03 19:45:32 ┆ 11 ┆ 2 ┆ 9 │ │ 2020-01-08 23:16:43 ┆ 1 ┆ 1 ┆ 1 │ └─────────────────────┴───────┴───────┴───────┘Если использовать подсчёт индекса в
periodилиoffset, он будет основан на значениях вindex_column:>>> df = pl.DataFrame({"int": [0, 4, 5, 6, 8], "value": [1, 4, 2, 4, 1]}) >>> df.rolling("int", period="3i").agg(pl.col("int").alias("aggregated")) shape: (5, 2) ┌─────┬────────────┐ │ int ┆ aggregated │ │ --- ┆ --- │ │ i64 ┆ list[i64] │ ╞═════╪════════════╡ │ 0 ┆ [0] │ │ 4 ┆ [4] │ │ 5 ┆ [4, 5] │ │ 6 ┆ [4, 5, 6] │ │ 8 ┆ [6, 8] │ └─────┴────────────┘Если нужно, чтобы подсчёт индекса основывался на номере строки, можно объединить
rollingсwith_row_index().
rolling( index_column: IntoExpr, *, period: str | timedelta, offset: str | timedelta | None = None, closed: ClosedInterval = 'right', group_by: IntoExpr | Iterable[IntoExpr] | None = None, ) → RollingGroupBy-
Возвращает значения одной строки — по индексу или предикату.
- Параметры:
-
- index
-
Индекс строки.
- by_predicate
-
Выбирает строку в соответствии с заданным выражением/предикатом.
- named
-
Возвращает словарь вместо кортежа. Словарь сопоставляет имя столбца со значением в строке. Это требует больше ресурсов, чем возврат обычного кортежа, но позволяет получать значения по имени столбца.
- Возвращает:
-
- кортеж (по умолчанию) или словарь значений строки
Предупреждение
НИКОГДА не используйте этот метод для перебора DataFrame по строкам; если требуется перебор строк, настоятельно рекомендуется использовать вместо него
iter_rows().См. также
Примечания
Параметры
indexиby_predicateвзаимоисключающие. Кроме того, для ясности параметрby_predicateнеобходимо передавать по имени.При использовании
by_predicateвозвращение чего-либо, кроме одной строки, считается ошибкой: если возвращено больше одной строки, возникаетTooManyRowsReturnedError, а если строк нет —NoRowsReturnedError(оба исключения являются подклассамиRowsError).Примеры
Укажите индекс, чтобы вернуть строку с этим индексом в виде кортежа.
>>> df = pl.DataFrame( ... { ... "foo": [1, 2, 3], ... "bar": [6, 7, 8], ... "ham": ["a", "b", "c"], ... } ... ) >>> df.row(2) (3, 8, 'c')Укажите
named=True, чтобы вместо этого получить словарь, сопоставляющий имена столбцов со значениями строки.>>> df.row(2, named=True) {'foo': 3, 'bar': 8, 'ham': 'c'}Используйте
by_predicate, чтобы вернуть строку, соответствующую заданному предикату.>>> df.row(by_predicate=(pl.col("ham") == "b")) (2, 7, 'b')
row( index: int | None = None, *, by_predicate: Expr | None = None, named: bool = False, ) → tuple[Any, ...] | dict[str, Any]-
Возвращает все данные DataFrame в виде списка строк со значениями, нативными для Python.
По умолчанию каждая строка возвращается как кортеж значений в том же порядке, что и столбцы фрейма. Если задать
named=True, строки будут возвращены в виде словарей.- Параметры:
-
- named
-
Возвращает словари вместо кортежей. Словари сопоставляют имя столбца со значением в строке. Это требует больше ресурсов, чем возврат обычного кортежа, но позволяет получать значения по имени столбца.
- Возвращает:
-
-
list of row value tuples (default), or list of dictionaries (if named=True).
-
Предупреждение
Перебор строк не оптимален, поскольку данные хранятся в столбцовом формате; по возможности используйте специальные методы экспорта/вывода. Также рассмотрите возможность использования
iter_rows, чтобы не материализовать все данные сразу: разница в производительности между этими вариантами невелика, но при обработке строк пакетами можно снизить пиковое потребление памяти.См. также
-
iter_rows -
Итератор по строкам данных фрейма (не материализует все строки).
-
rows_by_key -
Материализует данные фрейма в виде словаря с индексами-ключами.
Примечания
Если у вас есть временные значения с точностью до
ns, учтите, что Python изначально поддерживает точность только доμs; значения с точностью доnsпри преобразовании в Python будут усечены до микросекунд. Если это важно для вашего сценария использования, экспортируйте данные в другой формат (например, Arrow или NumPy).Примеры
>>> df = pl.DataFrame( ... { ... "x": ["a", "b", "b", "a"], ... "y": [1, 2, 3, 4], ... "z": [0, 3, 6, 9], ... } ... ) >>> df.rows() [('a', 1, 0), ('b', 2, 3), ('b', 3, 6), ('a', 4, 9)] >>> df.rows(named=True) [{'x': 'a', 'y': 1, 'z': 0}, {'x': 'b', 'y': 2, 'z': 3}, {'x': 'b', 'y': 3, 'z': 6}, {'x': 'a', 'y': 4, 'z': 9}]
rows( *, named: bool = False, ) → list[tuple[Any, ...]] | list[dict[str, Any]]-
Возвращает все данные в виде словаря со значениями, нативными для Python, сгруппированными по одному из столбцов.
Этот метод похож на
rows, но вместо возврата строк в виде плоского списка группирует их по значениям столбца (столбцов)keyи возвращает в виде словаря.Не используйте этот метод вместо встроенных операций: материализация всех данных фрейма в словарь обходится дорого. Его следует применять только тогда, когда нужно перенести значения в структуру данных Python или другой объект, не умеющий напрямую работать с Polars/Arrow.
- Параметры:
-
- key
-
Столбец (столбцы), используемый в качестве ключа возвращаемого словаря. Если указано несколько столбцов, ключом будет кортеж из соответствующих значений; в противном случае ключом будет строка.
- named
-
Возвращает строки в виде словарей вместо кортежей, сопоставляя имя столбца со значением строки.
- include_key
-
Включает значения ключей непосредственно в связанные с ними данные (по умолчанию значения ключей опущены для экономии памяти и повышения производительности, так как их можно восстановить из ключа).
- unique
-
Указывает, что ключ уникален; в результате каждому ключу будет соответствовать ровно одна строка. Если ключ на самом деле не уникален, будет возвращена последняя строка с этим ключом.
См. также
Примечания
Если у вас есть временные значения с точностью до
ns, учтите, что Python изначально поддерживает точность только доμs; значения с точностью доnsпри преобразовании в Python будут усечены до микросекунд. Если это важно для вашего сценария использования, экспортируйте данные в другой формат (например, Arrow или NumPy).Примеры
>>> df = pl.DataFrame( ... { ... "w": ["a", "b", "b", "a"], ... "x": ["q", "q", "q", "k"], ... "y": [1.0, 2.5, 3.0, 4.5], ... "z": [9, 8, 7, 6], ... } ... )Сгруппировать строки по указанному столбцу (столбцам)-ключу:
>>> df.rows_by_key(key=["w"]) defaultdict(<class 'list'>, {'a': [('q', 1.0, 9), ('k', 4.5, 6)], 'b': [('q', 2.5, 8), ('q', 3.0, 7)]})Вернуть те же группы строк в виде словарей:
>>> df.rows_by_key(key=["w"], named=True) defaultdict(<class 'list'>, {'a': [{'x': 'q', 'y': 1.0, 'z': 9}, {'x': 'k', 'y': 4.5, 'z': 6}], 'b': [{'x': 'q', 'y': 2.5, 'z': 8}, {'x': 'q', 'y': 3.0, 'z': 7}]})Вернуть группы строк, предполагая, что ключи уникальны:
>>> df.rows_by_key(key=["z"], unique=True) {9: ('a', 'q', 1.0), 8: ('b', 'q', 2.5), 7: ('b', 'q', 3.0), 6: ('a', 'k', 4.5)}Вернуть группы строк в виде словарей, предполагая, что ключи уникальны:
>>> df.rows_by_key(key=["z"], named=True, unique=True) {9: {'w': 'a', 'x': 'q', 'y': 1.0}, 8: {'w': 'b', 'x': 'q', 'y': 2.5}, 7: {'w': 'b', 'x': 'q', 'y': 3.0}, 6: {'w': 'a', 'x': 'k', 'y': 4.5}}Вернуть строки-словари, сгруппированные по составному ключу, включая значения ключей:
>>> df.rows_by_key(key=["w", "x"], named=True, include_key=True) defaultdict(<class 'list'>, {('a', 'q'): [{'w': 'a', 'x': 'q', 'y': 1.0, 'z': 9}], ('b', 'q'): [{'w': 'b', 'x': 'q', 'y': 2.5, 'z': 8}, {'w': 'b', 'x': 'q', 'y': 3.0, 'z': 7}], ('a', 'k'): [{'w': 'a', 'x': 'k', 'y': 4.5, 'z': 6}]})
rows_by_key( key: ColumnNameOrSelector | Sequence[ColumnNameOrSelector], *, named: bool = False, include_key: bool = False, unique: bool = False, ) → dict[Any, Any]-
Извлекает случайную выборку из этого DataFrame.
- Параметры:
-
- n
-
Количество возвращаемых элементов. Нельзя использовать вместе с
fraction. Еслиfractionравно None, по умолчанию используется значение 1. - fraction
-
Доля возвращаемых элементов. Нельзя использовать вместе с
n. - with_replacement
-
Разрешает выбирать одно и то же значение несколько раз.
- shuffle
-
Определяет порядок строк в выборке. Если значение True, выбранные строки явно перемешиваются. Если False, относительный порядок выбранных строк сохраняется (то есть они идут в том же порядке, что и в исходном DataFrame). Если значение None (по умолчанию), порядок не гарантируется и используется наиболее производительный алгоритм.
- seed
-
Начальное значение для генератора случайных чисел. Если задано None (по умолчанию), при каждом вызове выборки генерируется случайное начальное значение.
Примеры
>>> df = pl.DataFrame( ... { ... "foo": [1, 2, 3], ... "bar": [6, 7, 8], ... "ham": ["a", "b", "c"], ... } ... ) >>> df.sample(n=2, shuffle=False, seed=0) shape: (2, 3) ┌─────┬─────┬─────┐ │ foo ┆ bar ┆ ham │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ str │ ╞═════╪═════╪═════╡ │ 3 ┆ 8 ┆ c │ │ 2 ┆ 7 ┆ b │ └─────┴─────┴─────┘
sample( n: int | Series | None = None, *, fraction: float | Series | None = None, with_replacement: bool = False, shuffle: bool | None = None, seed: int | None = None, ) → DataFrame-
Возвращает упорядоченное соответствие имён столбцов их типам данных.
Примеры
>>> df = pl.DataFrame( ... { ... "foo": [1, 2, 3], ... "bar": [6.0, 7.0, 8.0], ... "ham": ["a", "b", "c"], ... } ... ) >>> df.schema Schema({'foo': Int64, 'bar': Float64, 'ham': String})
property schema: Schema
-
Выбирает столбцы из этого DataFrame.
- Параметры:
-
- *exprs
-
Столбец (столбцы) для выбора, заданные как позиционные аргументы. Принимает выражения. Строки интерпретируются как имена столбцов, а остальные входные данные, не являющиеся выражениями, — как литералы.
- **named_exprs
-
Дополнительные столбцы для выбора, заданные как именованные аргументы. Столбцам будут присвоены имена соответствующих аргументов.
Примеры
Передайте имя столбца, чтобы выбрать его.
>>> df = pl.DataFrame( ... { ... "foo": [1, 2, 3], ... "bar": [6, 7, 8], ... "ham": ["a", "b", "c"], ... } ... ) >>> df.select("foo") shape: (3, 1) ┌─────┐ │ foo │ │ --- │ │ i64 │ ╞═════╡ │ 1 │ │ 2 │ │ 3 │ └─────┘Чтобы выбрать несколько столбцов, передайте список их имён.
>>> df.select(["foo", "bar"]) shape: (3, 2) ┌─────┬─────┐ │ foo ┆ bar │ │ --- ┆ --- │ │ i64 ┆ i64 │ ╞═════╪═════╡ │ 1 ┆ 6 │ │ 2 ┆ 7 │ │ 3 ┆ 8 │ └─────┴─────┘
Также можно выбрать несколько столбцов, передав их имена как позиционные аргументы вместо списка. Допускаются и выражения.
>>> df.select(pl.col("foo"), pl.col("bar") + 1) shape: (3, 2) ┌─────┬─────┐ │ foo ┆ bar │ │ --- ┆ --- │ │ i64 ┆ i64 │ ╞═════╪═════╡ │ 1 ┆ 7 │ │ 2 ┆ 8 │ │ 3 ┆ 9 │ └─────┴─────┘Используйте именованные аргументы, чтобы легко задавать имена для входных выражений.
>>> df.select(threshold=pl.when(pl.col("foo") > 2).then(10).otherwise(0)) shape: (3, 1) ┌───────────┐ │ threshold │ │ --- │ │ i32 │ ╞═══════════╡ │ 0 │ │ 0 │ │ 10 │ └───────────┘
select( *exprs: IntoExpr | Iterable[IntoExpr], **named_exprs: IntoExpr, ) → DataFrame-
-
Выбрать столбцы из этого DataFrame.
Все выражения будут выполняться последовательно, а не параллельно. Используйте этот метод, если вычисление каждого выражения занимает мало времени.
- Параметры:
-
- *exprs
-
Столбец или столбцы для выбора, указанные в виде позиционных аргументов. Принимает выражения. Строки интерпретируются как имена столбцов, другие аргументы, не являющиеся выражениями, — как литералы.
- **named_exprs
-
Дополнительные столбцы для выбора, указанные в виде именованных аргументов. Столбцам будут присвоены имена соответствующих аргументов.
См. также
select_seq( *exprs: IntoExpr | Iterable[IntoExpr], **named_exprs: IntoExpr, ) → DataFrame-
Сериализовать этот DataFrame в файл или строку в формате JSON.
- Параметры:
-
- file
-
Путь к файлу или файловый объект с возможностью записи, в который будет записан результат. Если задано
None(значение по умолчанию), результат возвращается в виде строки. - format
-
Формат сериализации. Варианты:
-
"binary": сериализация в двоичный формат (bytes). Это значение используется по умолчанию. -
"json": сериализация в формат JSON (string).
-
Примечания
Сериализация нестабильна между версиями Polars: LazyFrame, сериализованный в одной версии Polars, может не десериализоваться в другой версии.
Примеры
Сериализуем DataFrame в двоичное представление.
>>> df = pl.DataFrame( ... { ... "foo": [1, 2, 3], ... "bar": [6, 7, 8], ... } ... ) >>> bytes = df.serialize() >>> type(bytes) <class 'bytes'>Позднее байты можно десериализовать обратно в DataFrame.
>>> import io >>> pl.DataFrame.deserialize(io.BytesIO(bytes)) shape: (3, 2) ┌─────┬─────┐ │ foo ┆ bar │ │ --- ┆ --- │ │ i64 ┆ i64 │ ╞═════╪═════╡ │ 1 ┆ 6 │ │ 2 ┆ 7 │ │ 3 ┆ 8 │ └─────┴─────┘
serialize( file: IOBase | str | Path | None = None, *, format: SerializationFormat = 'binary', ) → bytes | str | None-
Пометить столбец как отсортированный.
Это может ускорить последующие операции.
- Параметры:
-
- column
-
Отсортированный столбец
- descending
-
Указывает, отсортирован ли столбец по убыванию.
- nulls_last
-
Указывает, находятся ли значения null в конце.
Предупреждение
Если данные НЕ отсортированы, это может привести к некорректным результатам! Используйте с осторожностью!
set_sorted( column: str, *, descending: bool = False, nulls_last: bool = False, ) → DataFrame-
Получить форму DataFrame.
Примеры
>>> df = pl.DataFrame({"foo": [1, 2, 3, 4, 5]}) >>> df.shape (5, 1)
property shape: tuple[int, int]
-
Сдвинуть значения на заданное число индексов.
- Параметры:
-
- n
-
Число индексов для сдвига вперёд. Если передано отрицательное значение, значения сдвигаются в противоположном направлении.
- fill_value
-
Заполнить получившиеся значения null этим значением. Принимает скалярное выражение. Аргументы, не являющиеся выражениями, интерпретируются как литералы.
Примечания
Этот метод аналогичен операции
LAGв SQL, если значениеnположительно. При отрицательном значенииnон аналогиченLEAD.Примеры
По умолчанию значения сдвигаются вперёд на один индекс.
>>> df = pl.DataFrame( ... { ... "a": [1, 2, 3, 4], ... "b": [5, 6, 7, 8], ... } ... ) >>> df.shift() shape: (4, 2) ┌──────┬──────┐ │ a ┆ b │ │ --- ┆ --- │ │ i64 ┆ i64 │ ╞══════╪══════╡ │ null ┆ null │ │ 1 ┆ 5 │ │ 2 ┆ 6 │ │ 3 ┆ 7 │ └──────┴──────┘Передайте отрицательное значение, чтобы сдвинуть значения в противоположном направлении.
>>> df.shift(-2) shape: (4, 2) ┌──────┬──────┐ │ a ┆ b │ │ --- ┆ --- │ │ i64 ┆ i64 │ ╞══════╪══════╡ │ 3 ┆ 7 │ │ 4 ┆ 8 │ │ null ┆ null │ │ null ┆ null │ └──────┴──────┘
Укажите
fill_value, чтобы заполнить получившиеся значения null.>>> df.shift(-2, fill_value=100) shape: (4, 2) ┌─────┬─────┐ │ a ┆ b │ │ --- ┆ --- │ │ i64 ┆ i64 │ ╞═════╪═════╡ │ 3 ┆ 7 │ │ 4 ┆ 8 │ │ 100 ┆ 100 │ │ 100 ┆ 100 │ └─────┴─────┘
shift( n: int = 1, *, fill_value: IntoExpr | None = None, ) → DataFrame-
Показать первые
nстрок.- Параметры:
-
-
limitint -
Количество отображаемых строк. Если передано отрицательное значение, возвращаются все строки, кроме последних
abs(n). Если передано None, возвращаются все строки. -
ascii_tablesbool -
Использовать символы ASCII для отображения границ таблицы. Установите False, чтобы вернуться к стилю форматирования UTF8_FULL_CONDENSED по умолчанию. Подробнее см. в разделе
Config.set_ascii_tables(). -
decimal_separatorstr -
Задать символ-разделитель десятичной части. Подробнее см. в разделе
Config.set_decimal_separator(). -
thousands_separatorstr, bool -
Задать символ-разделитель групп разрядов. Подробнее см. в разделе
Config.set_thousands_separator(). -
float_precisionint -
Количество отображаемых знаков после запятой для значений с плавающей точкой. Подробнее см. в разделе
Config.set_float_precision(). -
fmt_float{“mixed”, “full”} -
Управляет отображением значений с плавающей точкой. Подробнее см. в разделе
Config.set_fmt_float(). Поддерживаются следующие варианты:- “mixed”: ограничить количество знаков после запятой и использовать экспоненциальную запись для больших и малых значений.
- “full”: выводить значение с плавающей точкой с полной точностью.
-
fmt_str_lengthsint -
Количество отображаемых символов для строковых значений. Подробнее см. в разделе
Config.set_fmt_str_lengths(). -
fmt_table_cell_list_lenint -
Количество отображаемых элементов для значений типа List. Подробнее см. в разделе
Config.set_fmt_table_cell_list_len(). -
tbl_cell_alignmentstr -
Задать выравнивание ячеек таблицы. Подробнее см. в разделе
Config.set_tbl_cell_alignment(). Поддерживаются следующие варианты:- “LEFT”: по левому краю
- “CENTER”: по центру
- “RIGHT”: по правому краю
-
tbl_cell_numeric_alignmentstr -
Задать выравнивание ячеек таблицы для числовых столбцов. Подробнее см. в разделе
Config.set_tbl_cell_numeric_alignment(). Поддерживаются следующие варианты:- “LEFT”: по левому краю
- “CENTER”: по центру
- “RIGHT”: по правому краю
-
tbl_colsint -
Количество отображаемых столбцов. Подробнее см. в разделе
Config.set_tbl_cols(). -
tbl_column_data_type_inlinebool -
Размещать тип данных рядом с именем столбца (справа, в скобках). Подробнее см. в разделе
Config.set_tbl_column_data_type_inline(). -
tbl_dataframe_shape_belowbool -
Выводить сведения о форме DataFrame под данными при отображении таблиц. Подробнее см. в разделе
Config.set_tbl_dataframe_shape_below(). -
tbl_formattingstr -
Задать стиль форматирования таблицы. Подробнее см. в разделе
Config.set_tbl_formatting(). Поддерживаются следующие варианты:- “ASCII_FULL”: ASCII, все границы и линии, включая разделители строк.
- “ASCII_FULL_CONDENSED”: то же, что ASCII_FULL, но с уменьшенным интервалом между строками.
- “ASCII_NO_BORDERS”: ASCII, без границ.
- “ASCII_BORDERS_ONLY”: ASCII, только границы.
- “ASCII_BORDERS_ONLY_CONDENSED”: ASCII, только границы, уменьшенный интервал между строками.
- “ASCII_HORIZONTAL_ONLY”: ASCII, только горизонтальные линии.
- “ASCII_MARKDOWN”: формат Markdown (многоточие ASCII для усечённых значений).
- “MARKDOWN”: формат Markdown (многоточие UTF-8 для усечённых значений).
- “UTF8_FULL”: UTF-8, все границы и линии, включая разделители строк.
- “UTF8_FULL_CONDENSED”: то же, что UTF8_FULL, но с уменьшенным интервалом между строками.
- “UTF8_NO_BORDERS”: UTF-8, без границ.
- “UTF8_BORDERS_ONLY”: UTF-8, только границы.
- “UTF8_HORIZONTAL_ONLY”: UTF-8, только горизонтальные линии.
- “NOTHING”: без границ и других линий.
-
tbl_hide_column_data_typesbool -
Скрывать типы данных столбцов таблицы (i64, f64, str и т. д.). Подробнее см. в разделе
Config.set_tbl_hide_column_data_types(). -
tbl_hide_column_namesbool -
Скрывать имена столбцов таблицы. Подробнее см. в разделе
Config.set_tbl_hide_column_names(). -
tbl_hide_dtype_separatorbool -
Скрывать разделитель ‘—’ между именами и типами столбцов. Подробнее см. в разделе
Config.set_tbl_hide_dtype_separator(). -
tbl_hide_dataframe_shapebool -
Скрывать сведения о форме DataFrame при отображении таблиц. Подробнее см. в разделе
Config.set_tbl_hide_dataframe_shape(). -
tbl_width_charsint -
Задать максимальную ширину таблицы в символах. Подробнее см. в разделе
Config.set_tbl_width_chars(). -
trim_decimal_zerosbool -
Удалять завершающие нули из значений типа Decimal. Подробнее см. в разделе
Config.set_trim_decimal_zeros().
-
См. также
Примеры
>>> df = pl.DataFrame( ... { ... "foo": [1, 2, 3, 4, 5], ... "bar": [6, 7, 8, 9, 10], ... "ham": ["a", "b", "c", "d", "e"], ... } ... ) >>> df.show(3) shape: (3, 3) ┌─────┬─────┬─────┐ │ foo ┆ bar ┆ ham │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ str │ ╞═════╪═════╪═════╡ │ 1 ┆ 6 ┆ a │ │ 2 ┆ 7 ┆ b │ │ 3 ┆ 8 ┆ c │ └─────┴─────┴─────┘Передайте отрицательное значение, чтобы получить все строки,
exceptпоследниеabs(n).>>> df.show(-3) shape: (2, 3) ┌─────┬─────┬─────┐ │ foo ┆ bar ┆ ham │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ str │ ╞═════╪═════╪═════╡ │ 1 ┆ 6 ┆ a │ │ 2 ┆ 7 ┆ b │ └─────┴─────┴─────┘
show( limit: int | None = 5, *, ascii_tables: bool | None = None, decimal_separator: str | None = None, thousands_separator: str | bool | None = None, float_precision: int | None = None, fmt_float: FloatFmt | None = None, fmt_str_lengths: int | None = None, fmt_table_cell_list_len: int | None = None, tbl_cell_alignment: Alignment | None = None, tbl_cell_numeric_alignment: Alignment | None = None, tbl_cols: int | None = None, tbl_column_data_type_inline: bool | None = None, tbl_dataframe_shape_below: bool | None = None, tbl_formatting: TableFormatNames | None = None, tbl_hide_column_data_types: bool | None = None, tbl_hide_column_names: bool | None = None, tbl_hide_dtype_separator: bool | None = None, tbl_hide_dataframe_shape: bool | None = None, tbl_width_chars: int | None = None, trim_decimal_zeros: bool | None = True, ) → None-
Уменьшить объём памяти, используемый DataFrame.
Размер памяти будет сокращён до точной ёмкости, необходимой для хранения данных.
shrink_to_fit( *, in_place: bool = False, ) → DataFrame-
Получить срез этого DataFrame.
- Параметры:
-
- offset
-
Начальный индекс. Поддерживается отрицательная индексация.
- length
-
Длина среза. Если задано
None, будут выбраны все строки, начиная с указанного смещения.
Примеры
>>> df = pl.DataFrame( ... { ... "foo": [1, 2, 3], ... "bar": [6.0, 7.0, 8.0], ... "ham": ["a", "b", "c"], ... } ... ) >>> df.slice(1, 2) shape: (2, 3) ┌─────┬─────┬─────┐ │ foo ┆ bar ┆ ham │ │ --- ┆ --- ┆ --- │ │ i64 ┆ f64 ┆ str │ ╞═════╪═════╪═════╡ │ 2 ┆ 7.0 ┆ b │ │ 3 ┆ 8.0 ┆ c │ └─────┴─────┴─────┘
slice( offset: int, length: int | None = None, ) → DataFrame-
Отсортировать DataFrame по указанным столбцам.
- Параметры:
-
- by
-
Столбец или столбцы для сортировки. Принимает выражения, включая селекторы. Строки интерпретируются как имена столбцов.
- *more_by
-
Дополнительные столбцы для сортировки, указанные в виде позиционных аргументов.
- descending
-
Сортировать по убыванию. При сортировке по нескольким столбцам можно указать направление для каждого столбца, передав последовательность логических значений.
- nulls_last
-
Размещать значения null в конце; можно указать одно логическое значение для всех столбцов или последовательность логических значений для настройки каждого столбца.
- multithreaded
-
Выполнять сортировку с использованием нескольких потоков.
- maintain_order
-
Сохранять ли порядок элементов с одинаковыми значениями.
Примеры
Передайте имя одного столбца, чтобы отсортировать по нему данные.
>>> df = pl.DataFrame( ... { ... "a": [1, 2, None], ... "b": [6.0, 5.0, 4.0], ... "c": ["a", "c", "b"], ... } ... ) >>> df.sort("a") shape: (3, 3) ┌──────┬─────┬─────┐ │ a ┆ b ┆ c │ │ --- ┆ --- ┆ --- │ │ i64 ┆ f64 ┆ str │ ╞══════╪═════╪═════╡ │ null ┆ 4.0 ┆ b │ │ 1 ┆ 6.0 ┆ a │ │ 2 ┆ 5.0 ┆ c │ └──────┴─────┴─────┘Также поддерживается сортировка по выражениям.
>>> df.sort(pl.col("a") + pl.col("b") * 2, nulls_last=True) shape: (3, 3) ┌──────┬─────┬─────┐ │ a ┆ b ┆ c │ │ --- ┆ --- ┆ --- │ │ i64 ┆ f64 ┆ str │ ╞══════╪═════╪═════╡ │ 2 ┆ 5.0 ┆ c │ │ 1 ┆ 6.0 ┆ a │ │ null ┆ 4.0 ┆ b │ └──────┴─────┴─────┘Чтобы отсортировать по нескольким столбцам, передайте список столбцов.
>>> df.sort(["c", "a"], descending=True) shape: (3, 3) ┌──────┬─────┬─────┐ │ a ┆ b ┆ c │ │ --- ┆ --- ┆ --- │ │ i64 ┆ f64 ┆ str │ ╞══════╪═════╪═════╡ │ 2 ┆ 5.0 ┆ c │ │ null ┆ 4.0 ┆ b │ │ 1 ┆ 6.0 ┆ a │ └──────┴─────┴─────┘
Или передайте позиционные аргументы, чтобы отсортировать по нескольким столбцам таким же образом.
>>> df.sort("c", "a", descending=[False, True]) shape: (3, 3) ┌──────┬─────┬─────┐ │ a ┆ b ┆ c │ │ --- ┆ --- ┆ --- │ │ i64 ┆ f64 ┆ str │ ╞══════╪═════╪═════╡ │ 1 ┆ 6.0 ┆ a │ │ null ┆ 4.0 ┆ b │ │ 2 ┆ 5.0 ┆ c │ └──────┴─────┴─────┘
sort( by: IntoExpr | Iterable[IntoExpr], *more_by: IntoExpr, descending: bool | Sequence[bool] = False, nulls_last: bool | Sequence[bool] = False, multithreaded: bool = True, maintain_order: bool = False, ) → DataFrame-
Выполнить SQL-запрос к DataFrame.
Добавлено в версии 0.20.24.
Предупреждение
Эта функциональность считается нестабильной, хотя она близка к тому, чтобы считаться стабильной. Она может измениться в любой момент, и такие изменения не будут считаться нарушающими совместимость.
- Параметры:
-
- query
-
SQL-запрос для выполнения.
- table_name
-
Необязательно: явно задать имя таблицы, представляющей текущий фрейм (по умолчанию — “self”).
См. также
Примечания
- Вызывающий DataFrame автоматически регистрируется как таблица в SQLContext под именем “self”. Чтобы получить доступ к DataFrame и LazyFrame из текущего пространства имён globals, используйте функцию верхнего уровня
pl.sql. - Для более гибкого управления регистрацией и выполнением используйте объект
SQLContext. - SQL-запрос выполняется в ленивом режиме, а затем собирается и возвращается в виде DataFrame.
Примеры
>>> from datetime import date >>> df1 = pl.DataFrame( ... { ... "a": [1, 2, 3], ... "b": ["zz", "yy", "xx"], ... "c": [date(1999, 12, 31), date(2010, 10, 10), date(2077, 8, 8)], ... } ... )Запрос к DataFrame с использованием SQL:
>>> df1.sql("SELECT c, b FROM self WHERE a > 1") shape: (2, 2) ┌────────────┬─────┐ │ c ┆ b │ │ --- ┆ --- │ │ date ┆ str │ ╞════════════╪═════╡ │ 2010-10-10 ┆ yy │ │ 2077-08-08 ┆ xx │ └────────────┴─────┘Применение преобразований к DataFrame с помощью SQL с псевдонимом “frame” для “self”.
>>> df1.sql( ... query=''' ... SELECT ... a, ... (a % 2 == 0) AS a_is_even, ... CONCAT_WS(':', b, b) AS b_b, ... EXTRACT(year FROM c) AS year, ... 0::float4 AS "zero", ... FROM frame ... ''', ... table_name="frame", ... ) shape: (3, 5) ┌─────┬───────────┬───────┬──────┬──────┐ │ a ┆ a_is_even ┆ b_b ┆ year ┆ zero │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ i64 ┆ bool ┆ str ┆ i32 ┆ f32 │ ╞═════╪═══════════╪═══════╪══════╪══════╡ │ 1 ┆ false ┆ zz:zz ┆ 1999 ┆ 0.0 │ │ 2 ┆ true ┆ yy:yy ┆ 2010 ┆ 0.0 │ │ 3 ┆ false ┆ xx:xx ┆ 2077 ┆ 0.0 │ └─────┴───────────┴───────┴──────┴──────┘
sql( query: str, *, table_name: str = 'self', ) → DataFrame-
Вычислить стандартное отклонение значений столбцов этого DataFrame.
- Параметры:
-
- ddof
-
«Число степеней свободы»: делитель, используемый при вычислении, равен N - ddof, где N — количество элементов. По умолчанию ddof равен 1.
Примеры
>>> df = pl.DataFrame( ... { ... "foo": [1, 2, 3], ... "bar": [6, 7, 8], ... "ham": ["a", "b", "c"], ... } ... ) >>> df.std() shape: (1, 3) ┌─────┬─────┬──────┐ │ foo ┆ bar ┆ ham │ │ --- ┆ --- ┆ --- │ │ f64 ┆ f64 ┆ str │ ╞═════╪═════╪══════╡ │ 1.0 ┆ 1.0 ┆ null │ └─────┴─────┴──────┘ >>> df.std(ddof=0) shape: (1, 3) ┌──────────┬──────────┬──────┐ │ foo ┆ bar ┆ ham │ │ --- ┆ --- ┆ --- │ │ f64 ┆ f64 ┆ str │ ╞══════════╪══════════╪══════╡ │ 0.816497 ┆ 0.816497 ┆ null │ └──────────┴──────────┴──────┘
std( ddof: int = 1, ) → DataFrame-
Создать таблицу Great Table для стилизации.
Предупреждение
Эта функциональность в настоящее время считается нестабильной. Она может измениться в любой момент, и такие изменения не будут считаться нарушающими совместимость.
Polars не реализует логику стилизации самостоятельно, а делегирует её пакету Great Tables. Дополнительные сведения и документацию см. в справочнике Great Tables.
Примеры
Импортируем несколько вспомогательных функций для стилизации и создадим пример данных:
>>> import polars.selectors as cs >>> from great_tables import loc, style >>> df = pl.DataFrame( ... { ... "site_id": [0, 1, 2], ... "measure_a": [5, 4, 6], ... "measure_b": [7, 3, 3], ... } ... )Используем site_id в качестве имён строк:
>>> df.style.tab_stub(rowname_col="site_id")
Зададим цвет фона строки с наибольшим значением measure_a:
>>> df.style.tab_style( ... style.fill("yellow"), ... loc.body(rows=pl.col("measure_a") == pl.col("measure_a").max()), ... )Добавим объединённый заголовок над столбцами measure:
>>> df.style.tab_spanner( ... "Measures", cs.starts_with("measure") ... )Отформатируем значения measure_b с точностью до двух знаков после запятой:
>>> df.style.fmt_number("measure_b", decimals=2)
property style: GT
-
Вычислить сумму значений столбцов этого DataFrame.
Примеры
>>> df = pl.DataFrame( ... { ... "foo": [1, 2, 3], ... "bar": [6, 7, 8], ... "ham": ["a", "b", "c"], ... } ... ) >>> df.sum() shape: (1, 3) ┌─────┬─────┬──────┐ │ foo ┆ bar ┆ ham │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ str │ ╞═════╪═════╪══════╡ │ 6 ┆ 21 ┆ null │ └─────┴─────┴──────┘
sum() → DataFrame
-
Сложить все значения по горизонтали, вдоль столбцов.
- Параметры:
-
- ignore_nulls
-
Игнорировать значения null (по умолчанию). Если задано
False, любое значение null во входных данных приведёт к результату null.
- Возвращает:
-
- Series
-
Series с именем
"sum".
Примеры
>>> df = pl.DataFrame( ... { ... "foo": [1, 2, 3], ... "bar": [4.0, 5.0, 6.0], ... } ... ) >>> df.sum_horizontal() shape: (3,) Series: 'sum' [f64] [ 5.0 7.0 9.0 ]
sum_horizontal( *, ignore_nulls: bool = True, ) → Series-
Получить последние
nстрок.- Параметры:
-
- n
-
Количество возвращаемых строк. Если передано отрицательное значение, возвращаются все строки, кроме первых
abs(n).
См. также
-
head,slice
Примеры
>>> df = pl.DataFrame( ... { ... "foo": [1, 2, 3, 4, 5], ... "bar": [6, 7, 8, 9, 10], ... "ham": ["a", "b", "c", "d", "e"], ... } ... ) >>> df.tail(3) shape: (3, 3) ┌─────┬─────┬─────┐ │ foo ┆ bar ┆ ham │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ str │ ╞═════╪═════╪═════╡ │ 3 ┆ 8 ┆ c │ │ 4 ┆ 9 ┆ d │ │ 5 ┆ 10 ┆ e │ └─────┴─────┴─────┘Передайте отрицательное значение, чтобы получить все строки,
exceptпервыеabs(n).>>> df.tail(-3) shape: (2, 3) ┌─────┬─────┬─────┐ │ foo ┆ bar ┆ ham │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ str │ ╞═════╪═════╪═════╡ │ 4 ┆ 9 ┆ d │ │ 5 ┆ 10 ┆ e │ └─────┴─────┴─────┘
tail( n: int = 5, ) → DataFrame-
Собрать базовые массивы Arrow в таблицу Arrow.
Эта операция в основном выполняется без копирования данных.
- Типы данных, для которых создаётся копия:
-
- CategoricalType
Изменено в версии 1.1: Параметр
futureпереименован вcompat_level.- Параметры:
-
- compat_level
-
Уровень совместимости, используемый при экспорте структур данных Polars. Большинству пользователей рекомендуется уровень совместимости по умолчанию. Используйте
pl.CompatLevel.oldest()для максимальной совместимости.pl.CompatLevel.newest()использует наивысший поддерживаемый уровень совместимости, но считается нестабильным и может измениться без того, чтобы это считалось нарушением совместимости.
Примеры
>>> df = pl.DataFrame( ... {"foo": [1, 2, 3, 4, 5, 6], "bar": ["a", "b", "c", "d", "e", "f"]} ... ) >>> df.to_arrow() pyarrow.Table foo: int64 bar: large_string ---- foo: [[1,2,3,4,5,6]] bar: [["a","b","c","d","e","f"]]
to_arrow( *, compat_level: CompatLevel | None = None, ) → Table-
Преобразовать DataFrame в словарь, сопоставляющий имена столбцов и значения.
- Параметры:
-
- as_series
-
True -> значения представлены как Series False -> значения представлены как List[Any]
См. также
Примеры
>>> df = pl.DataFrame( ... { ... "A": [1, 2, 3, 4, 5], ... "fruits": ["banana", "banana", "apple", "apple", "banana"], ... "B": [5, 4, 3, 2, 1], ... "cars": ["beetle", "audi", "beetle", "beetle", "beetle"], ... "optional": [28, 300, None, 2, -30], ... } ... ) >>> df shape: (5, 5) ┌─────┬────────┬─────┬────────┬──────────┐ │ A ┆ fruits ┆ B ┆ cars ┆ optional │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ i64 ┆ str ┆ i64 ┆ str ┆ i64 │ ╞═════╪════════╪═════╪════════╪══════════╡ │ 1 ┆ banana ┆ 5 ┆ beetle ┆ 28 │ │ 2 ┆ banana ┆ 4 ┆ audi ┆ 300 │ │ 3 ┆ apple ┆ 3 ┆ beetle ┆ null │ │ 4 ┆ apple ┆ 2 ┆ beetle ┆ 2 │ │ 5 ┆ banana ┆ 1 ┆ beetle ┆ -30 │ └─────┴────────┴─────┴────────┴──────────┘ >>> df.to_dict(as_series=False) {'A': [1, 2, 3, 4, 5], 'fruits': ['banana', 'banana', 'apple', 'apple', 'banana'], 'B': [5, 4, 3, 2, 1], 'cars': ['beetle', 'audi', 'beetle', 'beetle', 'beetle'], 'optional': [28, 300, None, 2, -30]} >>> df.to_dict(as_series=True) {'A': shape: (5,) Series: 'A' [i64] [ 1 2 3 4 5 ], 'fruits': shape: (5,) Series: 'fruits' [str] [ "banana" "banana" "apple" "apple" "banana" ], 'B': shape: (5,) Series: 'B' [i64] [ 5 4 3 2 1 ], 'cars': shape: (5,) Series: 'cars' [str] [ "beetle" "audi" "beetle" "beetle" "beetle" ], 'optional': shape: (5,) Series: 'optional' [i64] [ 28 300 null 2 -30 ]}
to_dict( *, as_series: bool = True, ) → dict[str, Series] | dict[str, list[Any]]-
Преобразовать каждую строку в словарь значений нативных типов Python.
Примечания
Если у вас есть временные значения с точностью
ns, учтите, что Python изначально поддерживает точность только доμs; значения с точностьюnsпри преобразовании в Python будут усечены до микросекунд. Если это важно для вашего сценария использования, экспортируйте данные в другой формат (например, Arrow или NumPy).Примеры
>>> df = pl.DataFrame({"foo": [1, 2, 3], "bar": [4, 5, 6]}) >>> df.to_dicts() [{'foo': 1, 'bar': 4}, {'foo': 2, 'bar': 5}, {'foo': 3, 'bar': 6}]
to_dicts() → list[dict[str, Any]]
-
Преобразовать категориальные переменные в фиктивные (индикаторные) переменные.
- Параметры:
-
- columns
-
Имена столбцов или селекторы, которые нужно преобразовать в фиктивные переменные. Если задано
None(по умолчанию), преобразуются все столбцы. - separator
-
Разделитель, используемый при формировании имён столбцов.
- drop_first
-
Удалить первую категорию из кодируемых переменных.
- drop_nulls
-
Если в Series есть значения
None, столбецnullне создаётся
Примеры
>>> df = pl.DataFrame( ... { ... "foo": [1, 2], ... "bar": [3, 4], ... "ham": ["a", "b"], ... } ... ) >>> df.to_dummies() shape: (2, 6) ┌───────┬───────┬───────┬───────┬───────┬───────┐ │ foo_1 ┆ foo_2 ┆ bar_3 ┆ bar_4 ┆ ham_a ┆ ham_b │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ u8 ┆ u8 ┆ u8 ┆ u8 ┆ u8 ┆ u8 │ ╞═══════╪═══════╪═══════╪═══════╪═══════╪═══════╡ │ 1 ┆ 0 ┆ 1 ┆ 0 ┆ 1 ┆ 0 │ │ 0 ┆ 1 ┆ 0 ┆ 1 ┆ 0 ┆ 1 │ └───────┴───────┴───────┴───────┴───────┴───────┘>>> df.to_dummies(drop_first=True) shape: (2, 3) ┌───────┬───────┬───────┐ │ foo_2 ┆ bar_4 ┆ ham_b │ │ --- ┆ --- ┆ --- │ │ u8 ┆ u8 ┆ u8 │ ╞═══════╪═══════╪═══════╡ │ 0 ┆ 0 ┆ 0 │ │ 1 ┆ 1 ┆ 1 │ └───────┴───────┴───────┘
>>> import polars.selectors as cs >>> df.to_dummies(cs.integer(), separator=":") shape: (2, 5) ┌───────┬───────┬───────┬───────┬─────┐ │ foo:1 ┆ foo:2 ┆ bar:3 ┆ bar:4 ┆ ham │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ u8 ┆ u8 ┆ u8 ┆ u8 ┆ str │ ╞═══════╪═══════╪═══════╪═══════╪═════╡ │ 1 ┆ 0 ┆ 1 ┆ 0 ┆ a │ │ 0 ┆ 1 ┆ 0 ┆ 1 ┆ b │ └───────┴───────┴───────┴───────┴─────┘
>>> df.to_dummies(cs.integer(), drop_first=True, separator=":") shape: (2, 3) ┌───────┬───────┬─────┐ │ foo:2 ┆ bar:4 ┆ ham │ │ --- ┆ --- ┆ --- │ │ u8 ┆ u8 ┆ str │ ╞═══════╪═══════╪═════╡ │ 0 ┆ 0 ┆ a │ │ 1 ┆ 1 ┆ b │ └───────┴───────┴─────┘
to_dummies( columns: ColumnNameOrSelector | Sequence[ColumnNameOrSelector] | None = None, *, separator: str = '_', drop_first: bool = False, drop_nulls: bool = False, ) → DataFrame-
Преобразовать DataFrame в строковое представление, пригодное для создания экземпляра.
- Параметры:
-
- n
-
Использовать только первые n строк.
См. также
Примеры
>>> df = pl.DataFrame( ... [ ... pl.Series("foo", [1, 2, 3], dtype=pl.UInt8), ... pl.Series("bar", [6.0, 7.0, 8.0], dtype=pl.Float32), ... pl.Series("ham", ["a", "b", "c"], dtype=pl.String), ... ] ... ) >>> print(df.to_init_repr()) pl.DataFrame( [ pl.Series('foo', [1, 2, 3], dtype=pl.UInt8), pl.Series('bar', [6.0, 7.0, 8.0], dtype=pl.Float32), pl.Series('ham', ['a', 'b', 'c'], dtype=pl.String), ] )>>> df_from_str_repr = eval(df.to_init_repr()) >>> df_from_str_repr shape: (3, 3) ┌─────┬─────┬─────┐ │ foo ┆ bar ┆ ham │ │ --- ┆ --- ┆ --- │ │ u8 ┆ f32 ┆ str │ ╞═════╪═════╪═════╡ │ 1 ┆ 6.0 ┆ a │ │ 2 ┆ 7.0 ┆ b │ │ 3 ┆ 8.0 ┆ c │ └─────┴─────┴─────┘
to_init_repr( n: int = 1000, ) → str-
Преобразовать DataFrame в массив Jax или словарь массивов Jax.
Добавлено в версии 0.20.27.
Предупреждение
Эта функциональность в настоящее время считается нестабильной. Она может измениться в любой момент, и такие изменения не будут считаться нарушающими совместимость.
- Параметры:
-
-
return_type{“array”, “dict”} -
Задать тип возвращаемого значения: массив Jax или словарь массивов Jax.
- device
-
Задать устройство jax
Device, на котором будет создан массив; можно передать строку (например, “cpu”, “gpu” или “tpu”), и в этом случае устройство будет получено какjax.devices(string)[0]. Для более точного управления можно напрямую передать созданный объектDevice. Если задано None, массивы создаются на устройстве по умолчанию. - label
-
Одно или несколько имён столбцов, выражений или селекторов, обозначающих данные меток; если
return_typeимеет значение “dict”, вместо словаря{"col": array, }возвращается словарь{"label": ..., "features": ...}. - features
-
Одно или несколько имён столбцов, выражений или селекторов, содержащих данные признаков; если параметр не указан, используются все столбцы, не отнесённые к меткам. Применяется только, когда
return_typeимеет значение “dict”. - dtype
-
Унифицировать типы данных всех возвращаемых массивов; перед преобразованием в Array тип данных каждого столбца, который ещё не имеет требуемого типа, будет изменён. Обратите внимание: экспорт выполняется с одинарной точностью (32 бита), если конфигурация или среда Jax не задаёт иное (например, если “jax_enable_x64” установлено в True в объекте конфигурации при запуске или если переменная среды “JAX_ENABLE_X64” установлена в “1”).
-
order{“c”, “fortran”} -
Порядок индексов возвращаемого массива Jax: в стиле C (по строкам) или Fortran (по столбцам).
-
См. также
Примеры
>>> df = pl.DataFrame( ... { ... "lbl": [0, 1, 2, 3], ... "feat1": [1, 0, 0, 1], ... "feat2": [1.5, -0.5, 0.0, -2.25], ... } ... )Стандартный тип возвращаемого значения (2D-массив) на устройстве по умолчанию:
>>> df.to_jax() Array([[ 0. , 1. , 1.5 ], [ 1. , 0. , -0.5 ], [ 2. , 0. , 0. ], [ 3. , 1. , -2.25]], dtype=float32)Создать массив на графическом процессоре по умолчанию:
>>> a = df.to_jax(device="gpu") >>> a.device() GpuDevice(id=0, process_index=0)
Создать массив на определённом графическом процессоре:
>>> gpu_device = jax.devices("gpu")[1] >>> a = df.to_jax(device=gpu_device) >>> a.device() GpuDevice(id=1, process_index=0)В виде словаря отдельных массивов:
>>> df.to_jax("dict") {'lbl': Array([0, 1, 2, 3], dtype=int32), 'feat1': Array([1, 0, 0, 1], dtype=int32), 'feat2': Array([ 1.5 , -0.5 , 0. , -2.25], dtype=float32)}В виде словаря с “label” и “features”; обратите внимание, что параметр “features” не задан, поэтому по умолчанию в него входят все столбцы, не включённые в “label”:
>>> df.to_jax("dict", label="lbl") {'label': Array([[0], [1], [2], [3]], dtype=int32), 'features': Array([[ 1. , 1.5 ], [ 0. , -0.5 ], [ 0. , 0. ], [ 1. , -2.25]], dtype=float32)}В виде словаря с “label” и “features”, где каждый из них задан выражением col или селектором (их также можно использовать для приведения данных к типам, если для меток и признаков лучше подходят разные типы данных):
>>> import polars.selectors as cs >>> df.to_jax( ... return_type="dict", ... features=cs.float(), ... label=pl.col("lbl").cast(pl.UInt8), ... ) {'label': Array([[0], [1], [2], [3]], dtype=uint8), 'features': Array([[ 1.5 ], [-0.5 ], [ 0. ], [-2.25]], dtype=float32)}
to_jax( return_type: JaxExportType = 'array', *, device: jax.Device | str | None = None, label: str | Expr | Sequence[str | Expr] | None = None, features: str | Expr | Sequence[str | Expr] | None = None, dtype: PolarsDataType | None = None, order: IndexOrder = 'fortran', ) → jax.Array | dict[str, jax.Array]-
-
Преобразовать этот DataFrame в ndarray NumPy.
Эта операция копирует данные только при необходимости. Преобразование выполняется без копирования, если соблюдаются все следующие условия:
- DataFrame полностью непрерывен в памяти: все Series расположены последовательно, и каждая Series состоит из одного фрагмента.
- Тип данных — целое число или число с плавающей запятой.
- DataFrame не содержит значений null.
- Параметр
orderустановлен вfortran(по умолчанию). - Параметр
writableустановлен вFalse(по умолчанию).
- Параметры:
-
- order
-
Порядок индексов возвращаемого массива NumPy: в стиле C или Fortran. Как правило, использование порядка индексов в стиле Fortran выполняется быстрее. Однако для последующих приложений может быть предпочтительнее порядок в стиле C, чтобы избежать клонирования данных, например при преобразовании массива в одномерный.
- writable
-
Обеспечить возможность записи в результирующий массив. Если массив был создан без копирования, это принудительно приведёт к копированию данных, поскольку базовые данные Arrow неизменяемы.
- allow_copy
-
Разрешить копирование памяти для выполнения преобразования. Если установлено значение
False, преобразования, которые нельзя выполнить без копирования, завершатся ошибкой. - structured
-
Вернуть структурированный массив с типом данных, соответствующим схеме DataFrame. Если установлено значение
False(по умолчанию), вместо него возвращается двумерный ndarray. - use_pyarrow
-
При необходимости использовать pyarrow.Array.to_numpy
для преобразования в NumPy.
Устарело с версии 0.20.28: Теперь Polars по умолчанию использует для преобразования в NumPy собственный движок.
Примеры
В некоторых случаях числовые данные без значений null можно преобразовать без копирования. В результирующий массив нельзя будет записывать.
>>> df = pl.DataFrame({"a": [1, 2, 3]}) >>> arr = df.to_numpy() >>> arr array([[1], [2], [3]]) >>> arr.flags.writeable FalseУстановите
writable=True, чтобы принудительно скопировать данные и сделать массив доступным для записи.>>> df.to_numpy(writable=True).flags.writeable True
Если DataFrame содержит данные с разными числовыми типами, результирующий тип данных будет общим супертипом. Для этого потребуется копирование данных. Целочисленные типы со значениями null преобразуются в тип с плавающей запятой, где
nanобозначает значение null.>>> df = pl.DataFrame({"a": [1, 2, None], "b": [4.0, 5.0, 6.0]}) >>> df.to_numpy() array([[ 1., 4.], [ 2., 5.], [nan, 6.]])Установите
allow_copy=False, чтобы вызвать ошибку, если потребуется копирование данных.>>> s.to_numpy(allow_copy=False) Traceback (most recent call last): ... RuntimeError: copy not allowed: cannot convert to a NumPy array without copying data
По умолчанию Polars использует порядок с непрерывным хранением в стиле F. Используйте
order="c", чтобы результирующий массив имел непрерывное хранение в стиле C.>>> df.to_numpy(order="c").flags.c_contiguous True
DataFrame со смешанными типами данных будет преобразован в массив с типом object.
>>> df = pl.DataFrame( ... { ... "foo": [1, 2, 3], ... "bar": [6.5, 7.0, 8.5], ... "ham": ["a", "b", "c"], ... }, ... schema_overrides={"foo": pl.UInt8, "bar": pl.Float32}, ... ) >>> df.to_numpy() array([[1, 6.5, 'a'], [2, 7.0, 'b'], [3, 8.5, 'c']], dtype=object)Установите
structured=True, чтобы преобразовать данные в структурированный массив, который позволяет лучше сохранять отдельные данные столбцов, например имя и тип данных.>>> df.to_numpy(structured=True) array([(1, 6.5, 'a'), (2, 7. , 'b'), (3, 8.5, 'c')], dtype=[('foo', 'u1'), ('bar', '<f4'), ('ham', '<U1')])
to_numpy( *, order: IndexOrder = 'fortran', writable: bool = False, allow_copy: bool = True, structured: bool = False, use_pyarrow: bool | None = None, ) → np.ndarray[Any, Any]-
Преобразовать этот DataFrame в DataFrame pandas.
Эта операция копирует данные, если параметр
use_pyarrow_extension_arrayне включён.- Параметры:
-
- use_pyarrow_extension_array
-
Использовать для столбцов DataFrame pandas массивы расширений на основе PyArrow вместо массивов NumPy. Это позволяет выполнять операции без копирования и сохранять значения null. Последующие операции над результирующим DataFrame pandas могут вызвать преобразование в NumPy, если они не поддерживаются вычислительными функциями PyArrow.
- **kwargs
-
Дополнительные именованные аргументы, передаваемые в
pyarrow.Table.to_pandas().
- Возвращает:
-
-
pandas.DataFrame
-
Примечания
Для выполнения этой операции необходимо установить
pandasиpyarrow.Примеры
>>> df = pl.DataFrame( ... { ... "foo": [1, 2, 3], ... "bar": [6.0, 7.0, 8.0], ... "ham": ["a", "b", "c"], ... } ... ) >>> df.to_pandas() foo bar ham 0 1 6.0 a 1 2 7.0 b 2 3 8.0 cЗначения null в числовых столбцах преобразуются в
NaN.>>> df = pl.DataFrame( ... { ... "foo": [1, 2, None], ... "bar": [6.0, None, 8.0], ... "ham": [None, "b", "c"], ... } ... ) >>> df.to_pandas() foo bar ham 0 1.0 6.0 NaN 1 2.0 NaN b 2 NaN 8.0 cПередайте
use_pyarrow_extension_array=True, чтобы получить DataFrame pandas со столбцами на основе массивов расширений PyArrow. Это позволит сохранить значения null.>>> df.to_pandas(use_pyarrow_extension_array=True) foo bar ham 0 1 6.0 <NA> 1 2 <NA> b 2 <NA> 8.0 c >>> _.dtypes foo int64[pyarrow] bar double[pyarrow] ham large_string[pyarrow] dtype: object
to_pandas( *, use_pyarrow_extension_array: bool = False, **kwargs: Any, ) → DataFrame-
Выбрать столбец как Series по индексу.
- Параметры:
-
- index
-
Индекс выбранного элемента.
См. также
Примеры
>>> df = pl.DataFrame( ... { ... "foo": [1, 2, 3], ... "bar": [6, 7, 8], ... "ham": ["a", "b", "c"], ... } ... ) >>> df.to_series(1) shape: (3,) Series: 'bar' [i64] [ 6 7 8 ]
to_series( index: int = 0, ) → Series-
Преобразовать
DataFrameвSeriesтипаStruct.- Параметры:
-
- name
-
Имя структурной Series.
Примеры
>>> df = pl.DataFrame( ... { ... "a": [1, 2, 3, 4, 5], ... "b": ["one", "two", "three", "four", "five"], ... } ... ) >>> df.to_struct("nums") shape: (5,) Series: 'nums' [struct[2]] [ {1,"one"} {2,"two"} {3,"three"} {4,"four"} {5,"five"} ]
to_struct( name: str = '', ) → Series-
Преобразовать DataFrame в тензор PyTorch, набор данных или словарь тензоров.
Добавлено в версии 0.20.23.
Предупреждение
В настоящее время эта функциональность считается нестабильной. Она может быть изменена в любой момент, и такие изменения не будут считаться нарушающими совместимость.
- Параметры:
-
-
return_type{“tensor”, “dataset”, “dict”} -
Задать тип возвращаемого значения: тензор PyTorch, PolarsDataset (специализированный для фреймов TensorDataset) или словарь тензоров.
- label
-
Одно или несколько имён столбцов, выражений или селекторов, задающих метки для данных признаков; если
return_typeравно «dataset», PolarsDataset будет возвращать кортежи тензоров(features, label)для каждой строки. В противном случае он возвращает кортежи тензоров(features,), в которых признак содержит все данные строки. - features
-
Одно или несколько имён столбцов, выражений или селекторов, содержащих данные признаков; если параметр не указан, используются все столбцы, не заданные как метки.
- dtype
-
Унифицировать тип данных всех возвращаемых тензоров; перед преобразованием в тензор столбцы, тип которых отличается от требуемого, будут приведены к нему. Это относится и к столбцу меток, если только метка не является выражением (например,
pl.col("label_column").cast(pl.Int16)).
-
См. также
Примеры
>>> df = pl.DataFrame( ... { ... "lbl": [0, 1, 2, 3], ... "feat1": [1, 0, 0, 1], ... "feat2": [1.5, -0.5, 0.0, -2.25], ... } ... )Стандартный тип возвращаемого значения (Tensor) с супертипом f32:
>>> df.to_torch(dtype=pl.Float32) tensor([[ 0.0000, 1.0000, 1.5000], [ 1.0000, 0.0000, -0.5000], [ 2.0000, 0.0000, 0.0000], [ 3.0000, 1.0000, -2.2500]])В виде словаря отдельных тензоров:
>>> df.to_torch("dict") {'lbl': tensor([0, 1, 2, 3]), 'feat1': tensor([1, 0, 0, 1]), 'feat2': tensor([ 1.5000, -0.5000, 0.0000, -2.2500], dtype=torch.float64)}В виде словаря «label» и «features». Обратите внимание: поскольку «features» не задан, по умолчанию используются все столбцы, кроме входящих в «label»:
>>> df.to_torch("dict", label="lbl", dtype=pl.Float32) {'label': tensor([[0.], [1.], [2.], [3.]]), 'features': tensor([[ 1.0000, 1.5000], [ 0.0000, -0.5000], [ 0.0000, 0.0000], [ 1.0000, -2.2500]])}В виде PolarsDataset с супертипом f64:
>>> ds = df.to_torch("dataset", dtype=pl.Float64) >>> ds[3] (tensor([ 3.0000, 1.0000, -2.2500], dtype=torch.float64),) >>> ds[:2] (tensor([[ 0.0000, 1.0000, 1.5000], [ 1.0000, 0.0000, -0.5000]], dtype=torch.float64),) >>> ds[[0, 3]] (tensor([[ 0.0000, 1.0000, 1.5000], [ 3.0000, 1.0000, -2.2500]], dtype=torch.float64),)Для удобства в PolarsDataset можно включить данные половинной точности для экспериментов (обычно это задаётся для модели или конвейера):
>>> list(ds.half()) [(tensor([0.0000, 1.0000, 1.5000], dtype=torch.float16),), (tensor([ 1.0000, 0.0000, -0.5000], dtype=torch.float16),), (tensor([2., 0., 0.], dtype=torch.float16),), (tensor([ 3.0000, 1.0000, -2.2500], dtype=torch.float16),)]
Передать PolarsDataset в DataLoader, указав метку:
>>> from torch.utils.data import DataLoader >>> ds = df.to_torch("dataset", label="lbl") >>> dl = DataLoader(ds, batch_size=2) >>> batches = list(dl) >>> batches[0] [tensor([[ 1.0000, 1.5000], [ 0.0000, -0.5000]], dtype=torch.float64), tensor([0, 1])]Обратите внимание: метки можно задавать в виде выражений, что позволяет использовать для них тип данных, отличный от типа столбцов признаков (поддерживаются метки из нескольких столбцов).
>>> ds = df.to_torch( ... return_type="dataset", ... dtype=pl.Float32, ... label=pl.col("lbl").cast(pl.Int16), ... ) >>> ds[:2] (tensor([[ 1.0000, 1.5000], [ 0.0000, -0.5000]]), tensor([0, 1], dtype=torch.int16))Простая интеграция, например, со scikit-learn и другими наборами данных:
>>> from sklearn.datasets import fetch_california_housing >>> housing = fetch_california_housing() >>> df = pl.DataFrame( ... data=housing.data, ... schema=housing.feature_names, ... ).with_columns( ... Target=housing.target, ... ) >>> train = df.to_torch("dataset", label="Target") >>> loader = DataLoader( ... train, ... shuffle=True, ... batch_size=64, ... )
to_torch( return_type: TorchExportType = 'tensor', *, label: str | Expr | Sequence[str | Expr] | None = None, features: str | Expr | Sequence[str | Expr] | None = None, dtype: PolarsDataType | None = None, ) → torch.Tensor | dict[str, torch.Tensor] | PolarsDataset-
Вернуть
kстрок с наибольшими значениями.Элементы, отличные от null, всегда имеют приоритет перед элементами null независимо от значения
reverse. Порядок результата не гарантируется. Если требуется отсортировать результат, вызовитеsort()после этой функции.Изменено в версии 1.0.0: Параметр
descendingпереименован вreverse.- Параметры:
-
- k
-
Количество возвращаемых строк.
- by
-
Столбец или столбцы, используемые для определения строк с наибольшими значениями. Принимает выражения. Строки интерпретируются как имена столбцов.
- reverse
-
Рассматривать
kнаименьших элементов столбца или столбцовby(вместоkнаибольших). Для каждого столбца можно задать отдельное значение, передав последовательность логических значений.
См. также
Примеры
>>> df = pl.DataFrame( ... { ... "a": ["a", "b", "a", "b", "b", "c"], ... "b": [2, 1, 1, 3, 2, 1], ... } ... )Получить строки, содержащие 4 наибольших значения в столбце b.
>>> df.top_k(4, by="b") shape: (4, 2) ┌─────┬─────┐ │ a ┆ b │ │ --- ┆ --- │ │ str ┆ i64 │ ╞═════╪═════╡ │ b ┆ 3 │ │ a ┆ 2 │ │ b ┆ 2 │ │ b ┆ 1 │ └─────┴─────┘
Получить строки с 4 наибольшими значениями при сортировке по столбцам b и a.
>>> df.top_k(4, by=["b", "a"]) shape: (4, 2) ┌─────┬─────┐ │ a ┆ b │ │ --- ┆ --- │ │ str ┆ i64 │ ╞═════╪═════╡ │ b ┆ 3 │ │ b ┆ 2 │ │ a ┆ 2 │ │ c ┆ 1 │ └─────┴─────┘
top_k( k: int, *, by: IntoExpr | Iterable[IntoExpr], reverse: bool | Sequence[bool] = False, ) → DataFrame-
Транспонировать DataFrame относительно диагонали.
- Параметры:
-
- include_header
-
Если параметр задан, имена столбцов будут добавлены в качестве первого столбца.
- header_name
-
Если задан параметр
include_header, он определяет имя добавляемого столбца. - column_names
-
Необязательный итерируемый объект, возвращающий строки, или строка с именем существующего столбца. Эти значения станут именами столбцов со значениями (не заголовков) в транспонированных данных.
- Возвращает:
-
- DataFrame
Примечания
Это очень затратная операция. Возможно, её можно выполнить другим способом.
Примеры
>>> df = pl.DataFrame({"a": [1, 2, 3], "b": [4, 5, 6]}) >>> df.transpose(include_header=True) shape: (2, 4) ┌────────┬──────────┬──────────┬──────────┐ │ column ┆ column_0 ┆ column_1 ┆ column_2 │ │ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ i64 ┆ i64 ┆ i64 │ ╞════════╪══════════╪══════════╪══════════╡ │ a ┆ 1 ┆ 2 ┆ 3 │ │ b ┆ 4 ┆ 5 ┆ 6 │ └────────┴──────────┴──────────┴──────────┘Заменить автоматически сгенерированные имена столбцов списком
>>> df.transpose(include_header=False, column_names=["x", "y", "z"]) shape: (2, 3) ┌─────┬─────┬─────┐ │ x ┆ y ┆ z │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ i64 │ ╞═════╪═════╪═════╡ │ 1 ┆ 2 ┆ 3 │ │ 4 ┆ 5 ┆ 6 │ └─────┴─────┴─────┘
Включить заголовок в качестве отдельного столбца
>>> df.transpose( ... include_header=True, header_name="foo", column_names=["x", "y", "z"] ... ) shape: (2, 4) ┌─────┬─────┬─────┬─────┐ │ foo ┆ x ┆ y ┆ z │ │ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ i64 ┆ i64 ┆ i64 │ ╞═════╪═════╪═════╪═════╡ │ a ┆ 1 ┆ 2 ┆ 3 │ │ b ┆ 4 ┆ 5 ┆ 6 │ └─────┴─────┴─────┴─────┘
Заменить автоматически сгенерированные имена столбцов именами, полученными из функции-генератора
>>> def name_generator(): ... base_name = "my_column_" ... count = 0 ... while True: ... yield f"{base_name}{count}" ... count += 1 >>> df.transpose(include_header=False, column_names=name_generator()) shape: (2, 3) ┌─────────────┬─────────────┬─────────────┐ │ my_column_0 ┆ my_column_1 ┆ my_column_2 │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ i64 │ ╞═════════════╪═════════════╪═════════════╡ │ 1 ┆ 2 ┆ 3 │ │ 4 ┆ 5 ┆ 6 │ └─────────────┴─────────────┴─────────────┘Использовать существующий столбец в качестве новых имён столбцов
>>> df = pl.DataFrame(dict(id=["i", "j", "k"], a=[1, 2, 3], b=[4, 5, 6])) >>> df.transpose(column_names="id") shape: (2, 3) ┌─────┬─────┬─────┐ │ i ┆ j ┆ k │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ i64 │ ╞═════╪═════╪═════╡ │ 1 ┆ 2 ┆ 3 │ │ 4 ┆ 5 ┆ 6 │ └─────┴─────┴─────┘ >>> df.transpose(include_header=True, header_name="new_id", column_names="id") shape: (2, 4) ┌────────┬─────┬─────┬─────┐ │ new_id ┆ i ┆ j ┆ k │ │ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ i64 ┆ i64 ┆ i64 │ ╞════════╪═════╪═════╪═════╡ │ a ┆ 1 ┆ 2 ┆ 3 │ │ b ┆ 4 ┆ 5 ┆ 6 │ └────────┴─────┴─────┴─────┘
transpose( *, include_header: bool = False, header_name: str = 'column', column_names: str | Iterable[str] | None = None, ) → DataFrame-
Удалить из этого DataFrame повторяющиеся строки.
- Параметры:
-
- subset
-
Имена столбцов, селекторы или выражения, используемые для поиска повторяющихся строк. Если установлено значение
None(по умолчанию), учитываются все столбцы. -
keep{‘first’, ‘last’, ‘any’, ‘none’} -
Указывает, какую из повторяющихся строк следует сохранить.
-
- «any»: не гарантирует, какая именно строка будет сохранена.
-
Это позволяет выполнять дополнительные оптимизации.
- «none»: не сохранять повторяющиеся строки.
- «first»: сохранить первую уникальную строку.
- «last»: сохранить последнюю уникальную строку.
-
- maintain_order
-
Сохранить исходный порядок строк DataFrame. Это увеличивает вычислительные затраты. Если установить значение
True, запуск с потоковым движком будет невозможен.
- Возвращает:
-
- DataFrame
-
DataFrame с уникальными строками.
Примечания
Для тех, кто знаком с Pandas: эта функция похожа на
pandas.DataFrame.drop_duplicates.Примеры
>>> df = pl.DataFrame( ... { ... "foo": [1, 2, 3, 1, 1], ... "bar": ["a", "a", "a", "x", "x"], ... "ham": ["b", "b", "b", "y", "y"], ... } ... )По умолчанию при определении уникальности строк учитываются все столбцы:
>>> df.unique(maintain_order=True) shape: (4, 3) ┌─────┬─────┬─────┐ │ foo ┆ bar ┆ ham │ │ --- ┆ --- ┆ --- │ │ i64 ┆ str ┆ str │ ╞═════╪═════╪═════╡ │ 1 ┆ a ┆ b │ │ 2 ┆ a ┆ b │ │ 3 ┆ a ┆ b │ │ 1 ┆ x ┆ y │ └─────┴─────┴─────┘
При проверке уникальности можно учитывать только часть столбцов и задавать, какую строку сохранять при обнаружении повторов:
>>> df.unique(subset="foo", keep="first", maintain_order=True) shape: (3, 3) ┌─────┬─────┬─────┐ │ foo ┆ bar ┆ ham │ │ --- ┆ --- ┆ --- │ │ i64 ┆ str ┆ str │ ╞═════╪═════╪═════╡ │ 1 ┆ a ┆ b │ │ 2 ┆ a ┆ b │ │ 3 ┆ a ┆ b │ └─────┴─────┴─────┘ >>> df.unique(subset="foo", keep="last", maintain_order=True) shape: (3, 3) ┌─────┬─────┬─────┐ │ foo ┆ bar ┆ ham │ │ --- ┆ --- ┆ --- │ │ i64 ┆ str ┆ str │ ╞═════╪═════╪═════╡ │ 2 ┆ a ┆ b │ │ 3 ┆ a ┆ b │ │ 1 ┆ x ┆ y │ └─────┴─────┴─────┘ >>> df.unique(subset="foo", keep="none", maintain_order=True) shape: (2, 3) ┌─────┬─────┬─────┐ │ foo ┆ bar ┆ ham │ │ --- ┆ --- ┆ --- │ │ i64 ┆ str ┆ str │ ╞═════╪═════╪═════╡ │ 2 ┆ a ┆ b │ │ 3 ┆ a ┆ b │ └─────┴─────┴─────┘
Для задания параметра «subset» можно использовать селекторы:
>>> import polars.selectors as cs >>> df.unique(subset=cs.string(), maintain_order=True) shape: (2, 3) ┌─────┬─────┬─────┐ │ foo ┆ bar ┆ ham │ │ --- ┆ --- ┆ --- │ │ i64 ┆ str ┆ str │ ╞═════╪═════╪═════╡ │ 1 ┆ a ┆ b │ │ 1 ┆ x ┆ y │ └─────┴─────┴─────┘
Для параметра «subset» можно также использовать произвольное выражение. В этом примере для определения уникальности используется часть метки перед «:»:
>>> df = pl.DataFrame( ... { ... "label": ["xx:1", "xx:2", "yy:3", "yy:4"], ... "value": [100, 200, 300, 400], ... } ... ) >>> df.unique( ... subset=pl.col("label").str.extract(r"^(\w+):"), ... maintain_order=True, ... keep="first", ... ) shape: (2, 2) ┌───────┬───────┐ │ label ┆ value │ │ --- ┆ --- │ │ str ┆ i64 │ ╞═══════╪═══════╡ │ xx:1 ┆ 100 │ │ yy:3 ┆ 300 │ └───────┴───────┘
unique( subset: IntoExpr | Collection[IntoExpr] | None = None, *, keep: UniqueKeepStrategy = 'any', maintain_order: bool = False, ) → DataFrame-
Разложить структурные столбцы на отдельные столбцы для каждого поля.
Новые столбцы будут вставлены во фрейм на место структурного столбца.
Если столбцы не указаны, будут разложены все структурные столбцы.
- Параметры:
-
- columns
-
Имя или имена структурных столбцов, которые нужно разложить.
- *more_columns
-
Дополнительные столбцы для разложения, заданные позиционными аргументами.
- separator
-
Переименовать выходные столбцы, объединив имя структурного столбца, разделитель и имя поля.
Примеры
>>> df = pl.DataFrame( ... { ... "before": ["foo", "bar"], ... "t_a": [1, 2], ... "t_b": ["a", "b"], ... "t_c": [True, None], ... "t_d": [[1, 2], [3]], ... "after": ["baz", "womp"], ... } ... ).select("before", pl.struct(pl.col("^t_.$")).alias("t_struct"), "after") >>> df shape: (2, 3) ┌────────┬─────────────────────┬───────┐ │ before ┆ t_struct ┆ after │ │ --- ┆ --- ┆ --- │ │ str ┆ struct[4] ┆ str │ ╞════════╪═════════════════════╪═══════╡ │ foo ┆ {1,"a",true,[1, 2]} ┆ baz │ │ bar ┆ {2,"b",null,[3]} ┆ womp │ └────────┴─────────────────────┴───────┘ >>> df.unnest("t_struct") shape: (2, 6) ┌────────┬─────┬─────┬──────┬───────────┬───────┐ │ before ┆ t_a ┆ t_b ┆ t_c ┆ t_d ┆ after │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ i64 ┆ str ┆ bool ┆ list[i64] ┆ str │ ╞════════╪═════╪═════╪══════╪═══════════╪═══════╡ │ foo ┆ 1 ┆ a ┆ true ┆ [1, 2] ┆ baz │ │ bar ┆ 2 ┆ b ┆ null ┆ [3] ┆ womp │ └────────┴─────┴─────┴──────┴───────────┴───────┘Разложить все структурные столбцы, вызвав функцию без аргументов:
>>> df.unnest() shape: (2, 6) ┌────────┬─────┬─────┬──────┬───────────┬───────┐ │ before ┆ t_a ┆ t_b ┆ t_c ┆ t_d ┆ after │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ i64 ┆ str ┆ bool ┆ list[i64] ┆ str │ ╞════════╪═════╪═════╪══════╪═══════════╪═══════╡ │ foo ┆ 1 ┆ a ┆ true ┆ [1, 2] ┆ baz │ │ bar ┆ 2 ┆ b ┆ null ┆ [3] ┆ womp │ └────────┴─────┴─────┴──────┴───────────┴───────┘
>>> df = pl.DataFrame( ... { ... "before": ["foo", "bar"], ... "t_a": [1, 2], ... "t_b": ["a", "b"], ... "t_c": [True, None], ... "t_d": [[1, 2], [3]], ... "after": ["baz", "womp"], ... } ... ).select( ... "before", ... pl.struct(pl.col("^t_.$").name.map(lambda t: t[2:])).alias("t"), ... "after", ... ) >>> df.unnest("t", separator="::") shape: (2, 6) ┌────────┬──────┬──────┬──────┬───────────┬───────┐ │ before ┆ t::a ┆ t::b ┆ t::c ┆ t::d ┆ after │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ i64 ┆ str ┆ bool ┆ list[i64] ┆ str │ ╞════════╪══════╪══════╪══════╪═══════════╪═══════╡ │ foo ┆ 1 ┆ a ┆ true ┆ [1, 2] ┆ baz │ │ bar ┆ 2 ┆ b ┆ null ┆ [3] ┆ womp │ └────────┴──────┴──────┴──────┴───────────┴───────┘
unnest( columns: ColumnNameOrSelector | Collection[ColumnNameOrSelector] | None = None, *more_columns: ColumnNameOrSelector, separator: str | None = None, ) → DataFrame-
Преобразовать DataFrame из широкого формата в длинный.
Идентификаторы при этом можно оставить.
Эта функция помогает преобразовать DataFrame в формат, где один или несколько столбцов являются переменными-идентификаторами (индексом), а все остальные столбцы, рассматриваемые как измеряемые переменные (on), «переворачиваются» в ось строк. В результате остаются только два столбца, не являющихся идентификаторами: «variable» и «value».
- Параметры:
-
- on
-
Столбец или столбцы, селекторы для использования в качестве переменных-значений; если
onпуст, столбцы использоваться не будут. Если установлено значениеNone(по умолчанию), будут использоваться все столбцы, отсутствующие вindex. - index
-
Столбец или столбцы, селекторы для использования в качестве переменных-идентификаторов.
- variable_name
-
Имя столбца
variable. По умолчанию — «variable». - value_name
-
Имя столбца
value. По умолчанию — «value».
Примечания
Для тех, кто знаком с pandas: эта функция похожа на
pandas.DataFrame.melt, но вместоid_varsиспользуетсяindex, а вместоvalue_vars—on. В других фреймворках эта операция может называтьсяpivot_longer.Порядок строк в результате не определён.
Примеры
>>> df = pl.DataFrame( ... { ... "a": ["x", "y", "z"], ... "b": [1, 3, 5], ... "c": [2, 4, 6], ... } ... ) >>> import polars.selectors as cs >>> df.unpivot(cs.numeric(), index="a") shape: (6, 3) ┌─────┬──────────┬───────┐ │ a ┆ variable ┆ value │ │ --- ┆ --- ┆ --- │ │ str ┆ str ┆ i64 │ ╞═════╪══════════╪═══════╡ │ x ┆ b ┆ 1 │ │ y ┆ b ┆ 3 │ │ z ┆ b ┆ 5 │ │ x ┆ c ┆ 2 │ │ y ┆ c ┆ 4 │ │ z ┆ c ┆ 6 │ └─────┴──────────┴───────┘
unpivot( on: ColumnNameOrSelector | Sequence[ColumnNameOrSelector] | None = None, *, index: ColumnNameOrSelector | Sequence[ColumnNameOrSelector] | None = None, variable_name: str | None = None, value_name: str | None = None, ) → DataFrame-
Преобразовать длинную таблицу в широкую без выполнения агрегации.
Эта операция может быть намного быстрее pivot, поскольку позволяет пропустить этап группировки.
- Параметры:
-
- step
-
Количество строк в преобразованном фрейме.
-
how{ ‘vertical’, ‘horizontal’ } -
Направление преобразования.
- columns
-
Имя или имена столбцов либо селекторы для включения в операцию. Если установлено значение
None(по умолчанию), используются все столбцы. - fill_values
-
Заполнить этим значением данные, не помещающиеся в новый размер.
Примеры
>>> from string import ascii_uppercase >>> df = pl.DataFrame( ... { ... "x": list(ascii_uppercase[0:8]), ... "y": pl.int_range(1, 9, eager=True), ... } ... ).with_columns( ... z=pl.int_ranges(pl.col("y"), pl.col("y") + 2, dtype=pl.UInt8), ... ) >>> df shape: (8, 3) ┌─────┬─────┬──────────┐ │ x ┆ y ┆ z │ │ --- ┆ --- ┆ --- │ │ str ┆ i64 ┆ list[u8] │ ╞═════╪═════╪══════════╡ │ A ┆ 1 ┆ [1, 2] │ │ B ┆ 2 ┆ [2, 3] │ │ C ┆ 3 ┆ [3, 4] │ │ D ┆ 4 ┆ [4, 5] │ │ E ┆ 5 ┆ [5, 6] │ │ F ┆ 6 ┆ [6, 7] │ │ G ┆ 7 ┆ [7, 8] │ │ H ┆ 8 ┆ [8, 9] │ └─────┴─────┴──────────┘ >>> df.unstack(step=4, how="vertical") shape: (4, 6) ┌─────┬─────┬─────┬─────┬──────────┬──────────┐ │ x_0 ┆ x_1 ┆ y_0 ┆ y_1 ┆ z_0 ┆ z_1 │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ str ┆ i64 ┆ i64 ┆ list[u8] ┆ list[u8] │ ╞═════╪═════╪═════╪═════╪══════════╪══════════╡ │ A ┆ E ┆ 1 ┆ 5 ┆ [1, 2] ┆ [5, 6] │ │ B ┆ F ┆ 2 ┆ 6 ┆ [2, 3] ┆ [6, 7] │ │ C ┆ G ┆ 3 ┆ 7 ┆ [3, 4] ┆ [7, 8] │ │ D ┆ H ┆ 4 ┆ 8 ┆ [4, 5] ┆ [8, 9] │ └─────┴─────┴─────┴─────┴──────────┴──────────┘ >>> df.unstack(step=2, how="horizontal") shape: (4, 6) ┌─────┬─────┬─────┬─────┬──────────┬──────────┐ │ x_0 ┆ x_1 ┆ y_0 ┆ y_1 ┆ z_0 ┆ z_1 │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ str ┆ i64 ┆ i64 ┆ list[u8] ┆ list[u8] │ ╞═════╪═════╪═════╪═════╪══════════╪══════════╡ │ A ┆ B ┆ 1 ┆ 2 ┆ [1, 2] ┆ [2, 3] │ │ C ┆ D ┆ 3 ┆ 4 ┆ [3, 4] ┆ [4, 5] │ │ E ┆ F ┆ 5 ┆ 6 ┆ [5, 6] ┆ [6, 7] │ │ G ┆ H ┆ 7 ┆ 8 ┆ [7, 8] ┆ [8, 9] │ └─────┴─────┴─────┴─────┴──────────┴──────────┘ >>> import polars.selectors as cs >>> df.unstack(step=5, columns=cs.numeric(), fill_values=0) shape: (5, 2) ┌─────┬─────┐ │ y_0 ┆ y_1 │ │ --- ┆ --- │ │ i64 ┆ i64 │ ╞═════╪═════╡ │ 1 ┆ 6 │ │ 2 ┆ 7 │ │ 3 ┆ 8 │ │ 4 ┆ 0 │ │ 5 ┆ 0 │ └─────┴─────┘
unstack( *, step: int, how: UnstackDirection = 'vertical', columns: ColumnNameOrSelector | Sequence[ColumnNameOrSelector] | None = None, fill_values: list[Any] | None = None, ) → DataFrame-
Обновить значения в этом
DataFrameзначениями изother.Предупреждение
Эта функциональность считается нестабильной. Она может быть изменена в любой момент, и такие изменения не будут считаться нарушающими совместимость.
- Параметры:
-
- other
-
DataFrame, значения из которого будут использованы для обновления.
- on
-
Имена столбцов, по которым будет выполнено соединение. Если установлено значение
None(по умолчанию), в качестве ключа соединения используется неявный индекс строк каждого фрейма. -
how{‘left’, ‘inner’, ‘full’} -
- «left» сохранит все строки из левой таблицы; строки могут дублироваться, если ключу строки в левой таблице соответствуют несколько строк в правом фрейме.
- «inner» сохранит только строки, ключ которых присутствует в обоих фреймах.
- «full» обновит существующие строки с совпадающими ключами и добавит все новые строки из переданного фрейма.
- left_on
-
Столбец или столбцы для соединения в левом DataFrame.
- right_on
-
Столбец или столбцы для соединения в правом DataFrame.
- include_nulls
-
Перезаписать значения в левом фрейме значениями null из правого фрейма. Если установлено значение
False(по умолчанию), значения null в правом фрейме игнорируются. -
maintain_order{‘none’, ‘left’, ‘right’, ‘left_right’, ‘right_left’} -
Порядок строк из исходных данных, который нужно сохранить. Подробности см. в описании
join(). В отличие отjoin, эта функция по умолчанию сохраняет порядок левого фрейма.
Примечания
Это синтаксический сахар для левого или внутреннего соединения, которое по умолчанию сохраняет порядок левого
DataFrame, с необязательным объединением столбцов приinclude_nulls = False.Примеры
>>> df = pl.DataFrame( ... { ... "A": [1, 2, 3, 4], ... "B": [400, 500, 600, 700], ... } ... ) >>> df shape: (4, 2) ┌─────┬─────┐ │ A ┆ B │ │ --- ┆ --- │ │ i64 ┆ i64 │ ╞═════╪═════╡ │ 1 ┆ 400 │ │ 2 ┆ 500 │ │ 3 ┆ 600 │ │ 4 ┆ 700 │ └─────┴─────┘ >>> new_df = pl.DataFrame( ... { ... "B": [-66, None, -99], ... "C": [5, 3, 1], ... } ... )Обновить значения
dfненулевыми значениями изnew_df, используя индекс строк:>>> df.update(new_df) shape: (4, 2) ┌─────┬─────┐ │ A ┆ B │ │ --- ┆ --- │ │ i64 ┆ i64 │ ╞═════╪═════╡ │ 1 ┆ -66 │ │ 2 ┆ 500 │ │ 3 ┆ -99 │ │ 4 ┆ 700 │ └─────┴─────┘
Обновить значения
dfненулевыми значениями изnew_df, используя индекс строк, и оставить только строки, присутствующие в обоих фреймах:>>> df.update(new_df, how="inner") shape: (3, 2) ┌─────┬─────┐ │ A ┆ B │ │ --- ┆ --- │ │ i64 ┆ i64 │ ╞═════╪═════╡ │ 1 ┆ -66 │ │ 2 ┆ 500 │ │ 3 ┆ -99 │ └─────┴─────┘
Обновить значения
dfненулевыми значениями изnew_df, используя стратегию полного внешнего соединения с явным заданием столбцов для соединения в каждом фрейме:>>> df.update(new_df, left_on=["A"], right_on=["C"], how="full") shape: (5, 2) ┌─────┬─────┐ │ A ┆ B │ │ --- ┆ --- │ │ i64 ┆ i64 │ ╞═════╪═════╡ │ 1 ┆ -99 │ │ 2 ┆ 500 │ │ 3 ┆ 600 │ │ 4 ┆ 700 │ │ 5 ┆ -66 │ └─────┴─────┘
Обновить значения
df, включая значения null изnew_df, используя стратегию полного внешнего соединения с явным заданием столбцов для соединения в каждом фрейме:>>> df.update(new_df, left_on="A", right_on="C", how="full", include_nulls=True) shape: (5, 2) ┌─────┬──────┐ │ A ┆ B │ │ --- ┆ --- │ │ i64 ┆ i64 │ ╞═════╪══════╡ │ 1 ┆ -99 │ │ 2 ┆ 500 │ │ 3 ┆ null │ │ 4 ┆ 700 │ │ 5 ┆ -66 │ └─────┴──────┘
update( other: DataFrame, on: str | Sequence[str] | None = None, how: Literal['left', 'inner', 'full'] = 'left', *, left_on: str | Sequence[str] | None = None, right_on: str | Sequence[str] | None = None, include_nulls: bool = False, maintain_order: MaintainOrderJoin | None = 'left', ) → DataFrame-
Выполнить передискретизацию DataFrame с регулярной частотой.
Аргумент
everyзадаётся строкой следующего формата:- 1ns (1 наносекунда)
- 1us (1 микросекунда)
- 1ms (1 миллисекунда)
- 1s (1 секунда)
- 1m (1 минута)
- 1h (1 час)
- 1d (1 календарный день)
- 1w (1 календарная неделя)
- 1mo (1 календарный месяц)
- 1q (1 календарный квартал)
- 1y (1 календарный год)
- 1i (1 индексный элемент)
Или их комбинацией:
- «3d12h4m25s» # 3 дня, 12 часов, 4 минуты и 25 секунд
Под «календарным днём» понимается то же время следующего дня (он может длиться не 24 часа из-за перехода на летнее время). Аналогично определяются «календарная неделя», «календарный месяц», «календарный квартал» и «календарный год».
Изменено в версии 0.20.14: Параметр
byпереименован вgroup_by.- Параметры:
-
- time_column
-
Столбец времени, используемый для определения date_range. Обратите внимание: для корректного результата этот столбец должен быть отсортирован.
- every
-
Интервал будет начинаться через каждые заданные «every» промежутки времени.
- group_by
-
Сначала сгруппировать данные по этим столбцам, а затем выполнить передискретизацию для каждой группы.
- maintain_order
-
Обеспечить предсказуемый порядок. Это замедляет выполнение.
- Возвращает:
-
- DataFrame
-
Результат будет отсортирован по
time_column(обратите внимание: если переданы столбцыgroup_by, сортировка будет выполняться только внутри каждой группы).
Примеры
Выполнить передискретизацию DataFrame с заданным интервалом.
>>> from datetime import datetime >>> df = pl.DataFrame( ... { ... "time": [ ... datetime(2021, 2, 1), ... datetime(2021, 4, 1), ... datetime(2021, 5, 1), ... datetime(2021, 6, 1), ... ], ... "groups": ["A", "B", "A", "B"], ... "values": [0, 1, 2, 3], ... } ... ).set_sorted("time") >>> df.upsample( ... time_column="time", every="1mo", group_by="groups", maintain_order=True ... ).select(pl.all().fill_null(strategy="forward")) shape: (7, 3) ┌─────────────────────┬────────┬────────┐ │ time ┆ groups ┆ values │ │ --- ┆ --- ┆ --- │ │ datetime[μs] ┆ str ┆ i64 │ ╞═════════════════════╪════════╪════════╡ │ 2021-02-01 00:00:00 ┆ A ┆ 0 │ │ 2021-03-01 00:00:00 ┆ A ┆ 0 │ │ 2021-04-01 00:00:00 ┆ A ┆ 0 │ │ 2021-05-01 00:00:00 ┆ A ┆ 2 │ │ 2021-04-01 00:00:00 ┆ B ┆ 1 │ │ 2021-05-01 00:00:00 ┆ B ┆ 1 │ │ 2021-06-01 00:00:00 ┆ B ┆ 3 │ └─────────────────────┴────────┴────────┘
upsample( time_column: str, *, every: str | timedelta, group_by: str | Sequence[str] | None = None, maintain_order: bool = False, ) → DataFrame-
Вычислить дисперсию столбцов этого DataFrame.
- Параметры:
-
- ddof
-
«Число степеней свободы»: делитель при вычислении равен N - ddof, где N — количество элементов. По умолчанию ddof равен 1.
Примеры
>>> df = pl.DataFrame( ... { ... "foo": [1, 2, 3], ... "bar": [6, 7, 8], ... "ham": ["a", "b", "c"], ... } ... ) >>> df.var() shape: (1, 3) ┌─────┬─────┬──────┐ │ foo ┆ bar ┆ ham │ │ --- ┆ --- ┆ --- │ │ f64 ┆ f64 ┆ str │ ╞═════╪═════╪══════╡ │ 1.0 ┆ 1.0 ┆ null │ └─────┴─────┴──────┘ >>> df.var(ddof=0) shape: (1, 3) ┌──────────┬──────────┬──────┐ │ foo ┆ bar ┆ ham │ │ --- ┆ --- ┆ --- │ │ f64 ┆ f64 ┆ str │ ╞══════════╪══════════╪══════╡ │ 0.666667 ┆ 0.666667 ┆ null │ └──────────┴──────────┴──────┘
var( ddof: int = 1, ) → DataFrame-
Увеличить этот DataFrame по вертикали, добавив к нему другой DataFrame.
- Параметры:
-
- other
-
DataFrame для добавления.
- in_place
-
Изменить на месте.
См. также
Примеры
>>> df1 = pl.DataFrame( ... { ... "foo": [1, 2], ... "bar": [6, 7], ... "ham": ["a", "b"], ... } ... ) >>> df2 = pl.DataFrame( ... { ... "foo": [3, 4], ... "bar": [8, 9], ... "ham": ["c", "d"], ... } ... ) >>> df1.vstack(df2) shape: (4, 3) ┌─────┬─────┬─────┐ │ foo ┆ bar ┆ ham │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ str │ ╞═════╪═════╪═════╡ │ 1 ┆ 6 ┆ a │ │ 2 ┆ 7 ┆ b │ │ 3 ┆ 8 ┆ c │ │ 4 ┆ 9 ┆ d │ └─────┴─────┴─────┘
vstack( other: DataFrame, *, in_place: bool = False, ) → DataFrame-
Получить количество столбцов.
- Возвращает:
-
- int
Примеры
>>> df = pl.DataFrame( ... { ... "foo": [1, 2, 3], ... "bar": [4, 5, 6], ... } ... ) >>> df.width 2
property width: int
-
Добавить столбцы в этот DataFrame.
Добавленные столбцы заменят существующие столбцы с такими же именами.
- Параметры:
-
- *exprs
-
Столбец или столбцы для добавления, заданные позиционными аргументами. Принимает выражения. Строки интерпретируются как имена столбцов, остальные аргументы, не являющиеся выражениями, — как литералы.
- **named_exprs
-
Дополнительные столбцы для добавления, заданные именованными аргументами. Столбцам будут присвоены имена соответствующих аргументов.
- Возвращает:
-
- DataFrame
-
Новый DataFrame с добавленными столбцами.
Примечания
Создание нового DataFrame с помощью этого метода не копирует существующие данные.
Примеры
Передайте выражение, чтобы добавить его в качестве нового столбца.
>>> df = pl.DataFrame( ... { ... "a": [1, 2, 3, 4], ... "b": [0.5, 4, 10, 13], ... "c": [True, True, False, True], ... } ... ) >>> df.with_columns((pl.col("a") ** 2).alias("a^2")) shape: (4, 4) ┌─────┬──────┬───────┬─────┐ │ a ┆ b ┆ c ┆ a^2 │ │ --- ┆ --- ┆ --- ┆ --- │ │ i64 ┆ f64 ┆ bool ┆ i64 │ ╞═════╪══════╪═══════╪═════╡ │ 1 ┆ 0.5 ┆ true ┆ 1 │ │ 2 ┆ 4.0 ┆ true ┆ 4 │ │ 3 ┆ 10.0 ┆ false ┆ 9 │ │ 4 ┆ 13.0 ┆ true ┆ 16 │ └─────┴──────┴───────┴─────┘Добавленные столбцы заменят существующие столбцы с такими же именами.
>>> df.with_columns(pl.col("a").cast(pl.Float64)) shape: (4, 3) ┌─────┬──────┬───────┐ │ a ┆ b ┆ c │ │ --- ┆ --- ┆ --- │ │ f64 ┆ f64 ┆ bool │ ╞═════╪══════╪═══════╡ │ 1.0 ┆ 0.5 ┆ true │ │ 2.0 ┆ 4.0 ┆ true │ │ 3.0 ┆ 10.0 ┆ false │ │ 4.0 ┆ 13.0 ┆ true │ └─────┴──────┴───────┘Несколько столбцов можно добавить с помощью позиционных аргументов.
>>> df.with_columns( ... (pl.col("a") ** 2).alias("a^2"), ... (pl.col("b") / 2).alias("b/2"), ... (pl.col("c").not_()).alias("not c"), ... ) shape: (4, 6) ┌─────┬──────┬───────┬─────┬──────┬───────┐ │ a ┆ b ┆ c ┆ a^2 ┆ b/2 ┆ not c │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ i64 ┆ f64 ┆ bool ┆ i64 ┆ f64 ┆ bool │ ╞═════╪══════╪═══════╪═════╪══════╪═══════╡ │ 1 ┆ 0.5 ┆ true ┆ 1 ┆ 0.25 ┆ false │ │ 2 ┆ 4.0 ┆ true ┆ 4 ┆ 2.0 ┆ false │ │ 3 ┆ 10.0 ┆ false ┆ 9 ┆ 5.0 ┆ true │ │ 4 ┆ 13.0 ┆ true ┆ 16 ┆ 6.5 ┆ false │ └─────┴──────┴───────┴─────┴──────┴───────┘Несколько столбцов также можно добавить, передав список выражений.
>>> df.with_columns( ... [ ... (pl.col("a") ** 2).alias("a^2"), ... (pl.col("b") / 2).alias("b/2"), ... (pl.col("c").not_()).alias("not c"), ... ] ... ) shape: (4, 6) ┌─────┬──────┬───────┬─────┬──────┬───────┐ │ a ┆ b ┆ c ┆ a^2 ┆ b/2 ┆ not c │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ i64 ┆ f64 ┆ bool ┆ i64 ┆ f64 ┆ bool │ ╞═════╪══════╪═══════╪═════╪══════╪═══════╡ │ 1 ┆ 0.5 ┆ true ┆ 1 ┆ 0.25 ┆ false │ │ 2 ┆ 4.0 ┆ true ┆ 4 ┆ 2.0 ┆ false │ │ 3 ┆ 10.0 ┆ false ┆ 9 ┆ 5.0 ┆ true │ │ 4 ┆ 13.0 ┆ true ┆ 16 ┆ 6.5 ┆ false │ └─────┴──────┴───────┴─────┴──────┴───────┘Используйте именованные аргументы, чтобы легко задавать имена входных выражений.
>>> df.with_columns( ... ab=pl.col("a") * pl.col("b"), ... not_c=pl.col("c").not_(), ... ) shape: (4, 5) ┌─────┬──────┬───────┬──────┬───────┐ │ a ┆ b ┆ c ┆ ab ┆ not_c │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ i64 ┆ f64 ┆ bool ┆ f64 ┆ bool │ ╞═════╪══════╪═══════╪══════╪═══════╡ │ 1 ┆ 0.5 ┆ true ┆ 0.5 ┆ false │ │ 2 ┆ 4.0 ┆ true ┆ 8.0 ┆ false │ │ 3 ┆ 10.0 ┆ false ┆ 30.0 ┆ true │ │ 4 ┆ 13.0 ┆ true ┆ 52.0 ┆ false │ └─────┴──────┴───────┴──────┴───────┘
with_columns( *exprs: IntoExpr | Iterable[IntoExpr], **named_exprs: IntoExpr, ) → DataFrame-
Добавить столбцы в этот DataFrame.
Добавленные столбцы заменят существующие столбцы с такими же именами.
Все выражения будут выполняться последовательно, а не параллельно. Используйте этот метод, если вычисления для каждого выражения недорогие.
- Параметры:
-
- *exprs
-
Столбец или столбцы для добавления, заданные позиционными аргументами. Принимает выражения. Строки интерпретируются как имена столбцов, остальные аргументы, не являющиеся выражениями, — как литералы.
- **named_exprs
-
Дополнительные столбцы для добавления, заданные именованными аргументами. Столбцам будут присвоены имена соответствующих аргументов.
- Возвращает:
-
- DataFrame
-
Новый DataFrame с добавленными столбцами.
См. также
with_columns_seq( *exprs: IntoExpr | Iterable[IntoExpr], **named_exprs: IntoExpr, ) → DataFrame-
Добавить в индекс 0 столбец со счётчиком строк.
Устарело с версии 0.20.4: Вместо этого используйте метод
with_row_index(). Обратите внимание: имя столбца по умолчанию изменилось с «row_nr» на «index».- Параметры:
-
- name
-
Имя добавляемого столбца.
- offset
-
Смещение, с которого начинается подсчёт строк. По умолчанию — 0.
Примеры
>>> df = pl.DataFrame( ... { ... "a": [1, 3, 5], ... "b": [2, 4, 6], ... } ... ) >>> df.with_row_count() shape: (3, 3) ┌────────┬─────┬─────┐ │ row_nr ┆ a ┆ b │ │ --- ┆ --- ┆ --- │ │ u32 ┆ i64 ┆ i64 │ ╞════════╪═════╪═════╡ │ 0 ┆ 1 ┆ 2 │ │ 1 ┆ 3 ┆ 4 │ │ 2 ┆ 5 ┆ 6 │ └────────┴─────┴─────┘
with_row_count( name: str = 'row_nr', offset: int = 0, ) → DataFrame-
Добавить индекс строк в качестве первого столбца DataFrame.
- Параметры:
-
- name
-
Имя столбца индекса.
- offset
-
Смещение, с которого начинается индекс. Не может быть отрицательным.
Примечания
У результирующего столбца нет особых свойств. Это обычный столбец типа
UInt32(илиUInt64вpolars[rt64]).Примеры
>>> df = pl.DataFrame( ... { ... "a": [1, 3, 5], ... "b": [2, 4, 6], ... } ... ) >>> df.with_row_index() shape: (3, 3) ┌───────┬─────┬─────┐ │ index ┆ a ┆ b │ │ --- ┆ --- ┆ --- │ │ u32 ┆ i64 ┆ i64 │ ╞═══════╪═════╪═════╡ │ 0 ┆ 1 ┆ 2 │ │ 1 ┆ 3 ┆ 4 │ │ 2 ┆ 5 ┆ 6 │ └───────┴─────┴─────┘ >>> df.with_row_index("id", offset=1000) shape: (3, 3) ┌──────┬─────┬─────┐ │ id ┆ a ┆ b │ │ --- ┆ --- ┆ --- │ │ u32 ┆ i64 ┆ i64 │ ╞══════╪═════╪═════╡ │ 1000 ┆ 1 ┆ 2 │ │ 1001 ┆ 3 ┆ 4 │ │ 1002 ┆ 5 ┆ 6 │ └──────┴─────┴─────┘Столбец индекса также можно создать с помощью выражений
int_range()иlen().>>> df.select( ... pl.int_range(pl.len(), dtype=pl.UInt32).alias("index"), ... pl.all(), ... ) shape: (3, 3) ┌───────┬─────┬─────┐ │ index ┆ a ┆ b │ │ --- ┆ --- ┆ --- │ │ u32 ┆ i64 ┆ i64 │ ╞═══════╪═════╪═════╡ │ 0 ┆ 1 ┆ 2 │ │ 1 ┆ 3 ┆ 4 │ │ 2 ┆ 5 ┆ 6 │ └───────┴─────┴─────┘
with_row_index( name: str = 'index', offset: int = 0, ) → DataFrame-
Записать в файл Apache Avro.
- Параметры:
-
- file
-
Путь к файлу или файловый объект с возможностью записи, в который будут записаны данные.
-
compression{‘uncompressed’, ‘snappy’, ‘deflate’} -
Метод сжатия. По умолчанию — «uncompressed».
- name
-
Имя схемы. По умолчанию — пустая строка.
Примеры
>>> import pathlib >>> >>> df = pl.DataFrame( ... { ... "foo": [1, 2, 3, 4, 5], ... "bar": [6, 7, 8, 9, 10], ... "ham": ["a", "b", "c", "d", "e"], ... } ... ) >>> path: pathlib.Path = dirpath / "new_file.avro" >>> df.write_avro(path)
write_avro( file: str | Path | IO[bytes], compression: AvroCompression = 'uncompressed', name: str = '', ) → None-
-
Скопировать
DataFrameв формате CSV в системный буфер обмена с помощьюwrite_csv.Удобно для вставки в Excel или другие аналогичные программы для работы с электронными таблицами.
- Параметры:
-
- separator
-
Разделять поля CSV этим символом.
- kwargs
-
Дополнительные аргументы для передачи в
write_csv.
См. также
-
polars.read_clipboard -
Прочитать DataFrame из буфера обмена.
-
write_csv -
Записать файл в формате CSV (значения, разделённые запятыми).
write_clipboard( *, separator: str = '\t', **kwargs: Any, ) → None-
Записать файл в формате CSV (значения, разделённые запятыми).
- Параметры:
-
- file
-
Путь к файлу или объект файлового типа с поддержкой записи, в который будет записан результат. Если задано
None(значение по умолчанию), вместо этого результат возвращается в виде строки. - include_bom
-
Следует ли включать BOM UTF-8 в вывод CSV.
- compression
-
Формат сжатия.
Предупреждение
Эта функциональность считается нестабильной. Она может быть изменена в любой момент без того, чтобы это считалось нарушением обратной совместимости.
- compression_level
-
Уровень сжатия: обычно от 0 до 9 или
None, чтобы позволить движку выбрать значение.Предупреждение
Эта функциональность считается нестабильной. Она может быть изменена в любой момент без того, чтобы это считалось нарушением обратной совместимости.
- check_extension
-
Проверять ли соответствие имени файла настройкам сжатия. Будет вызвана ошибка, если для сжатия задано значение ‘uncompressed’, а имя файла заканчивается на одно из значений (“.gz”, “.zst”, “.zstd”), либо если compression != ‘uncompressed’, а имя файла не заканчивается соответствующим расширением. Применяется только в том случае, если file — это путь.
Предупреждение
Эта функциональность считается нестабильной. Она может быть изменена в любой момент без того, чтобы это считалось нарушением обратной совместимости.
- include_header
-
Следует ли включать заголовок в вывод CSV.
- separator
-
Разделять поля CSV этим символом.
- line_terminator
-
Строка, используемая для завершения каждой строки.
- quote_char
-
Байт, используемый в качестве символа кавычек.
- batch_size
-
Количество строк, обрабатываемых одним потоком.
- datetime_format
-
Строка формата со спецификаторами, определёнными в библиотеке Rust chrono. Если формат не задан, точность дробной части по умолчанию определяется по максимальной единице времени, найденной в столбцах Datetime кадра (если таковые имеются).
- date_format
-
Строка формата со спецификаторами, определёнными в библиотеке Rust chrono.
- time_format
-
Строка формата со спецификаторами, определёнными в библиотеке Rust chrono.
- float_scientific
-
Следует ли всегда (true), никогда (false) или автоматически (None) использовать научную запись для типов данных с плавающей точкой.
- float_precision
-
Количество десятичных знаков для записи; применяется к обоим типам данных с плавающей точкой.
- decimal_comma
-
Использовать запятую вместо точки в качестве десятичного разделителя в стандартной записи. При необходимости числа с плавающей точкой будут заключены в кавычки; чтобы переопределить это поведение, задайте разделитель полей.
- null_value
-
Строка, представляющая нулевые значения (по умолчанию — пустая строка).
-
quote_style{‘necessary’, ‘always’, ‘non_numeric’, ‘never’} -
Определяет используемую стратегию заключения в кавычки.
- necessary (по умолчанию): заключает поля в кавычки только при необходимости. Это необходимо, если поля содержат кавычку, разделитель или символ окончания записи. Кавычки также необходимы при записи пустой записи (которую невозможно отличить от записи с одним пустым полем). Это значение используется по умолчанию.
- always: заключает в кавычки каждое поле. Всегда.
- never: никогда не заключает поля в кавычки, даже если это приводит к некорректным данным CSV (например, если не заключать в кавычки строки, содержащие разделитель).
- non_numeric: заключает в кавычки все поля, не являющиеся числовыми. То есть при записи поля, которое не разбирается как допустимое число с плавающей точкой или целое число, кавычки используются, даже если они не являются строго необходимыми.
- storage_options
-
Параметры, определяющие способ подключения к облачному провайдеру.
В настоящее время поддерживаются облачные провайдеры AWS, GCP и Azure. Список поддерживаемых ключей приведён здесь:
- aws
- gcp
- azure
- Hugging Face (
hf://): принимает ключ API в параметреtoken:{'token': '...'}или через переменную окруженияHF_TOKEN.
Если
storage_optionsне задан, Polars попытается получить необходимую информацию из переменных окружения. - credential_provider
-
Функция, которую можно вызвать для получения учётных данных облачного хранилища. Функция должна возвращать словарь ключей учётных данных и необязательное время истечения срока их действия.
Предупреждение
Эта функциональность считается нестабильной. Она может быть изменена в любой момент без того, чтобы это считалось нарушением обратной совместимости.
- retries
-
Количество повторных попыток в случае сбоя при обращении к облачному экземпляру.
Устарело с версии 1.37.1: Вместо этого передайте {“max_retries”: n} через
storage_options.
Примеры
>>> import pathlib >>> >>> df = pl.DataFrame( ... { ... "foo": [1, 2, 3, 4, 5], ... "bar": [6, 7, 8, 9, 10], ... "ham": ["a", "b", "c", "d", "e"], ... } ... ) >>> path: pathlib.Path = dirpath / "new_file.csv" >>> df.write_csv(path, separator=",")
write_csv( file: str | Path | IO[str] | IO[bytes] | None = None, *, include_bom: bool = False, compression: Literal['uncompressed', 'gzip', 'zstd'] = 'uncompressed', compression_level: int | None = None, check_extension: bool = True, include_header: bool = True, separator: str = ',', line_terminator: str = '\n', quote_char: str = '"', batch_size: int = 1024, datetime_format: str | None = None, date_format: str | None = None, time_format: str | None = None, float_scientific: bool | None = None, float_precision: int | None = None, decimal_comma: bool = False, null_value: str | None = None, quote_style: CsvQuoteStyle | None = None, storage_options: StorageOptionsDict | None = None, credential_provider: CredentialProviderFunction | Literal['auto'] | None = 'auto', retries: int | None = None, ) → str | None-
Записать данные Polars DataFrame в базу данных.
Добавлено в версии 0.20.26: Поддержка готовых объектов соединения в дополнение к строкам URI, а также новый параметр
engine_options.- Параметры:
-
- table_name
-
Имя таблицы в целевой базе данных SQL, с указанием схемы. Если имя таблицы содержит специальные символы, его следует заключить в кавычки.
- connection
-
Существующее соединение SQLAlchemy или ADBC с целевой базой данных либо строка URI, используемая для создания такого соединения, например:
- “postgresql://user:pass@server:port/database”
- “sqlite:////path/to/database.db”
-
if_table_exists{‘append’, ‘replace’, ‘fail’} -
Режим вставки:
- ‘replace’ создаст новую таблицу базы данных, перезаписав существующую.
- ‘append’ добавит данные в существующую таблицу.
- ‘fail’ вызовет ошибку, если таблица уже существует.
-
engine{‘sqlalchemy’, ‘adbc’} -
Выбрать движок для записи данных кадра; требуется только при передаче строки URI (по умолчанию используется ‘sqlalchemy’, если значение не задано).
- engine_options
-
Дополнительные параметры, передаваемые методу вставки, связанному с движком, указанным параметром
engine.- Если для
engineзадано значение “sqlalchemy”, вставка в настоящее время выполняется методомto_sqlиз Pandas (в дальнейшем от него планируется отказаться в пользу нативного решения). - Если для
engineзадано значение “adbc”, вставка выполняется методомadbc_ingestкурсора ADBC. Обратите внимание: при передаче готового объекта соединения для драйверов SQLite и Snowflake требуется PyArrow.
- Если для
- Возвращает:
-
- int
-
Количество затронутых строк, если драйвер предоставляет эту информацию. В противном случае возвращается -1.
Примеры
Вставка данных во временную таблицу с использованием URI PostgreSQL и движка ADBC:
>>> df.write_database( ... table_name="target_table", ... connection="postgresql://user:pass@server:port/database", ... engine="adbc", ... engine_options={"temporary": True}, ... )Вставка данных в таблицу с использованием соединения
pyodbcSQLAlchemy с SQL Server, созданного с параметром “fast_executemany=True” для повышения производительности:>>> pyodbc_uri = ( ... "mssql+pyodbc://user:pass@server:1433/test?" ... "driver=ODBC+Driver+18+for+SQL+Server" ... ) >>> engine = create_engine(pyodbc_uri, fast_executemany=True) >>> df.write_database( ... table_name="target_table", ... connection=engine, ... )
write_database( table_name: str, connection: ConnectionOrCursor | str, *, if_table_exists: DbWriteMode = 'fail', engine: DbWriteEngine | None = None, engine_options: dict[str, Any] | None = None, ) → int-
Записать DataFrame в виде таблицы Delta.
- Параметры:
-
- target
-
URI таблицы или объект DeltaTable.
-
mode{‘error’, ‘append’, ‘overwrite’, ‘ignore’, ‘merge’} -
Способ обработки существующих данных.
- Если задано ‘error’, при существовании таблицы будет вызвана ошибка (значение по умолчанию).
- Если задано ‘append’, будут добавлены новые данные.
- Если задано ‘overwrite’, таблица будет заменена новыми данными.
- Если задано ‘ignore’, при существовании таблицы запись не будет выполняться.
- Если задано ‘merge’, возвращается объект
TableMergerдля объединения данных DataFrame с существующими данными.
- overwrite_schema
-
Если True, разрешает обновление схемы таблицы.
Устарело с версии 0.20.14: Вместо этого используйте параметр
delta_write_optionsи передайте{"schema_mode": "overwrite"}. - storage_options
-
Дополнительные параметры для серверных компонентов хранения, поддерживаемых
deltalake. Для облачных хранилищ они могут включать настройки аутентификации и другие параметры. - credential_provider
-
Функция, которую можно вызвать для получения учётных данных облачного хранилища. Функция должна возвращать словарь ключей учётных данных и необязательное время истечения срока их действия.
Предупреждение
Эта функциональность считается нестабильной. Она может быть изменена в любой момент без того, чтобы это считалось нарушением обратной совместимости.
- delta_write_options
-
Дополнительные именованные аргументы при записи таблицы Delta Lake. Список поддерживаемых параметров записи см. здесь.
- delta_merge_options
-
Именованные аргументы, необходимые для
MERGEтаблицы Delta Lake. Список поддерживаемых параметров объединения см. здесь.
- Вызывает исключения:
-
- TypeError
-
Если DataFrame содержит неподдерживаемые типы данных.
- ArrowInvalidError
-
Если DataFrame содержит типы данных, которые не удалось привести к примитивному типу.
- TableNotFoundError
-
Если таблица Delta не существует и запускается действие MERGE.
Примечания
Типы данных Polars
NullиTimeне поддерживаются спецификацией протокола Delta и приведут к TypeError. Столбцы с типом данныхCategoricalпри записи будут преобразованы в обычные строки (не категориальные).Столбцы Polars всегда допускают нулевые значения. Чтобы записать данные в таблицу Delta со столбцами, не допускающими нулевые значения, необходимо передать пользовательскую схему pyarrow в
delta_write_options. См. последний пример ниже.Примеры
Запись DataFrame в файловую систему локального компьютера в виде таблицы Delta Lake.
>>> df = pl.DataFrame( ... { ... "foo": [1, 2, 3, 4, 5], ... "bar": [6, 7, 8, 9, 10], ... "ham": ["a", "b", "c", "d", "e"], ... } ... ) >>> table_path = "/path/to/delta-table/" >>> df.write_delta(table_path)Добавление данных в существующую таблицу Delta Lake в локальной файловой системе. Обратите внимание: операция завершится ошибкой, если схема новых данных не совпадает со схемой существующей таблицы.
>>> df.write_delta(table_path, mode="append")
Перезапись таблицы Delta Lake с созданием новой версии. Если схемы новых и старых данных совпадают, указывать
schema_modeне требуется.>>> existing_table_path = "/path/to/delta-table/" >>> df.write_delta( ... existing_table_path, ... mode="overwrite", ... delta_write_options={"schema_mode": "overwrite"}, ... )Запись DataFrame в виде таблицы Delta Lake в облачное объектное хранилище, например S3.
>>> table_path = "s3://bucket/prefix/to/delta-table/" >>> df.write_delta( ... table_path, ... storage_options={ ... "AWS_REGION": "THE_AWS_REGION", ... "AWS_ACCESS_KEY_ID": "THE_AWS_ACCESS_KEY_ID", ... "AWS_SECRET_ACCESS_KEY": "THE_AWS_SECRET_ACCESS_KEY", ... }, ... )Запись DataFrame в виде таблицы Delta Lake со столбцами, не допускающими нулевые значения.
>>> import pyarrow as pa >>> existing_table_path = "/path/to/delta-table/" >>> df.write_delta( ... existing_table_path, ... delta_write_options={ ... "schema": pa.schema([pa.field("foo", pa.int64(), nullable=False)]) ... }, ... )Запись DataFrame в виде таблицы Delta Lake со сжатием zstd. Список всех именованных аргументов
delta_write_optionsсм. в документации deltalake здесь, а параметры Writer Properties — в частности здесь.>>> import deltalake >>> df.write_delta( ... table_path, ... delta_write_options={ ... "writer_properties": deltalake.WriterProperties(compression="zstd"), ... }, ... )Объединение DataFrame с существующей таблицей Delta Lake. Список всех методов
TableMergerсм. в документации deltalake здесь.>>> df = pl.DataFrame( ... { ... "foo": [1, 2, 3, 4, 5], ... "bar": [6, 7, 8, 9, 10], ... "ham": ["a", "b", "c", "d", "e"], ... } ... ) >>> table_path = "/path/to/delta-table/" >>> ( ... df.write_delta( ... "table_path", ... mode="merge", ... delta_merge_options={ ... "predicate": "s.foo = t.foo", ... "source_alias": "s", ... "target_alias": "t", ... }, ... ) ... .when_matched_update_all() ... .when_not_matched_insert_all() ... .execute() ... )
write_delta( target: str | Path | deltalake.DeltaTable, *, mode: Literal['error', 'append', 'overwrite', 'ignore', 'merge'] = 'error', overwrite_schema: bool | None = None, storage_options: StorageOptionsDict | None = None, credential_provider: CredentialProviderFunction | Literal['auto'] | None = 'auto', delta_write_options: dict[str, Any] | None = None, delta_merge_options: dict[str, Any] | None = None, ) → deltalake.table.TableMerger | None-
Записать данные кадра в таблицу листа книги Excel.
- Параметры:
-
-
workbook{str, Workbook} -
Имя или путь к создаваемой книге в виде строки, объект BytesIO, файл, открытый в двоичном режиме, или незакрытый объект
xlsxwriter.Workbook. Если задано None, данные записываются вdataframe.xlsxв рабочем каталоге. -
worksheet{str, Worksheet} -
Имя целевого листа или объект
xlsxwriter.Worksheet(в этом случаеworkbookдолжен быть родительским объектомxlsxwriter.Workbook); если задано None, при создании новой книги данные записываются на “Sheet1” (обратите внимание: для записи в существующую книгу необходимо указать допустимое имя существующего или нового листа). -
position{str, tuple} -
Позиция таблицы в нотации Excel (например, “A1”) или кортеж целых чисел (строка, столбец).
-
table_style{str, dict} -
Именованный стиль таблицы Excel, например “Table Style Medium 4”, или словарь параметров
{"key":value,}, содержащий один или несколько следующих ключей: “style”, “first_column”, “last_column”, “banded_columns, “banded_rows”. -
table_namestr -
Имя выходного объекта таблицы на листе; на него можно ссылаться в формулах и диаграммах листа, а также в последующих операциях
xlsxwriter. -
column_formatsdict -
Словарь
{colname(s):str,}или{selector:str,}для применения строки формата Excel к указанным столбцам. Заданные здесь форматы (например, “dd/mm/yyyy”, “0.00%” и т. д.) переопределяют форматы, указанные вdtype_formats. -
dtype_formatsdict -
Словарь
{dtype:str,}, задающий формат Excel по умолчанию для указанного dtype. (Его можно переопределить отдельно для каждого столбца с помощью параметраcolumn_formats.) -
conditional_formatsdict -
Словарь, сопоставляющий имена столбцов (или селекторы) со строкой формата, словарём или списком, задающим параметры условного форматирования для указанных столбцов.
- Если в качестве строки указано имя типа, оно должно быть одним из допустимых типов
xlsxwriter, например “3_color_scale”, “data_bar” и т. д. - Если передан словарь, можно использовать любые поддерживаемые параметры
xlsxwriter, включая наборы значков, формулы и т. д. - Если передать несколько столбцов в виде кортежа или ключа, единый формат будет применён ко всем столбцам. Это удобно для создания тепловой карты, поскольку минимальные и максимальные значения будут определяться для всего диапазона, а не отдельно для каждого столбца.
- Наконец, можно передать список из указанных выше параметров, чтобы применить к одному диапазону несколько правил условного форматирования.
- Если в качестве строки указано имя типа, оно должно быть одним из допустимых типов
-
header_formatdict -
Словарь
{key:value,}с параметрами форматированияxlsxwriterдля строки заголовка таблицы, например{"bold":True, "font_color":"#702963"}. -
column_totals{bool, list, dict} -
Добавить строку итогов по столбцам в экспортируемую таблицу.
- Если задано True, для всех числовых столбцов будут вычислены итоги с помощью функции “sum”.
- Если передана строка, она должна быть именем допустимой функции вычисления итогов; эта функция будет применена ко всем числовым столбцам.
- Если передан список имён столбцов, итоги будут вычислены только для указанных столбцов.
- Для большего контроля передайте словарь
{colname:funcname,}.
Допустимые имена функций вычисления итогов по столбцам: “average”, “count_nums”, “count”, “max”, “min”, “std_dev”, “sum” и “var”.
-
column_widths{dict, int} -
Словарь
{colname:int,}или{selector:int,}либо целое число, задающее (или переопределяющее при автоматическом подборе) ширину столбцов таблицы в целых пикселях. Если задано целое число, это значение используется для всех столбцов таблицы. -
row_totals{dict, list, bool} -
Добавить столбец итогов по строкам справа от экспортируемой таблицы.
- Если задано True, в конце таблицы будет добавлен столбец с именем “total”, в котором для каждой строки будет вычислена сумма по всем числовым столбцам.
- Если передан список или последовательность имён столбцов, в суммировании будут участвовать только соответствующие столбцы.
- Также можно передать словарь
{colname:columns,}, чтобы создать один или несколько столбцов итогов с разными именами, ссылающихся на разные столбцы.
-
row_heights{dict, int} -
Целое число или словарь
{row_index:int,}, задающий высоту указанных строк (если передан словарь) или всех строк (если передано целое число), пересекающихся с телом таблицы (включая строку заголовка и строку итогов), в целых пикселях. Обратите внимание: отсчётrow_indexначинается с нуля, и это будет строка заголовка (если толькоinclude_headerне равно False). -
sparklinesdict -
Словарь
{colname:list,}или{colname:dict,}, задающий одну или несколько спарклайн-диаграмм для записи в новый столбец таблицы.- Если передан список имён столбцов (используемых в качестве источника данных спарклайна), применяются настройки спарклайна по умолчанию (например, линейная диаграмма без маркеров).
- Для большего контроля можно передать словарь параметров, совместимый с
xlsxwriter; в этом случае доступны три дополнительных ключа, специфичных для polars: “columns”, “insert_before” и “insert_after”. Они позволяют задать исходные столбцы и положение спарклайна относительно других столбцов таблицы. Если позиция не указана, спарклайны добавляются в конец таблицы (например, в крайний правый столбец) в заданном порядке.
-
formulasdict -
Словарь
{colname:formula,}или{colname:dict,}, задающий одну или несколько формул для записи в новый столбец таблицы. Настоятельно рекомендуется по возможности использовать в формулах структурированные ссылки — так проще ссылаться на столбцы по имени.- Если передана формула в виде строки (например, “=[@colx]*[@coly]”), столбец будет добавлен в конец таблицы (например, в крайний правый столбец), после всех спарклайнов по умолчанию и перед столбцами итогов по строкам.
- Для максимального контроля передайте словарь параметров со следующими ключами: “formula” (обязательный), один из “insert_before” или “insert_after” и необязательный “return_dtype”. Последний используется для надлежащего форматирования результата формулы и позволяет включать его в итоги по строкам и столбцам.
-
float_precisionint -
Количество знаков после запятой по умолчанию для столбцов с числами с плавающей точкой (это только указание для форматирования; фактические значения не округляются).
-
include_headerbool -
Указывает, следует ли создавать таблицу со строкой заголовка.
-
autofilterbool -
Если у таблицы есть заголовки, включить возможность автофильтрации.
-
autofitbool -
Вычислить ширину каждого столбца на основе данных.
-
hidden_columnsstr | list -
Имя столбца, список имён столбцов или селектор, задающий столбцы таблицы, которые следует скрыть на выходном листе.
-
hide_gridlinesbool -
Не отображать линии сетки на выходном листе.
-
sheet_zoomint -
Задать масштаб по умолчанию для выходного листа.
-
freeze_panesstr | (str, int, int) | (int, int) | (int, int, int, int) -
Закрепить области книги.
- Если передано значение (row, col), разделение областей выполняется в левом верхнем углу указанной ячейки; индексация начинается с нуля. Таким образом, чтобы закрепить только верхнюю строку, передайте (1, 0).
- Также для указания ячейки можно использовать её обозначение. Например, “A2” означает, что разделение выполняется в левом верхнем углу ячейки A2, что эквивалентно (1, 0).
- Если передано значение (row, col, top_row, top_col), области разделяются на основе
rowиcol, а прокручиваемая область начинается сtop_rowиtop_col. Таким образом, чтобы закрепить только верхнюю строку и начать прокручиваемую область со строки 10, столбца D (5-го столбца), передайте (1, 0, 9, 4). Использование обозначения ячейки для (row, col), например (“A2”, 9, 4), эквивалентно.
-
use_zip64bool -
Использовать ли расширения ZIP64 при записи книги. Это позволяет записывать очень большие файлы книг (не сжатые, размером не менее 4 ГБ), но снижает совместимость.
-
Примечания
- Список совместимых имён свойств формата
xlsxwriterприведён здесь. - Словари условного форматирования должны содержать определения, совместимые с xlsxwriter; polars самостоятельно применит их на листе с учётом положения листа и столбца. Список поддерживаемых параметров см. здесь: https://xlsxwriter.readthedocs.io/working_with_conditional_formats.html
- Аналогично, словари параметров спарклайнов должны содержать ключи и значения, совместимые с xlsxwriter, а также обязательный ключ polars “columns”, задающий источник данных спарклайна; исходные столбцы должны располагаться рядом. Для указания положения спарклайна в таблице доступны ещё два ключа, специфичных для polars: “insert_after” и “insert_before”. Значением этих ключей должно быть имя столбца экспортируемой таблицы. https://xlsxwriter.readthedocs.io/working_with_sparklines.html
- Словари формул должны содержать ключ “formula” и могут дополнительно содержать ключи “insert_after”, “insert_before” и/или “return_dtype”. Эти дополнительные ключи позволяют вставить столбец в определённое место таблицы и/или задать тип возвращаемого значения формулы (например, “Int64”, “Float64” и т. д.). В формулах, ссылающихся на столбцы таблицы, следует использовать синтаксис структурированных ссылок Excel, чтобы формула применялась корректно и относилась к таблице. https://support.microsoft.com/en-us/office/using-structured-references-with-excel-tables-f5ed2452-2337-4f71-bed3-c8ae6d2b276e
- Чтобы получить вывод без форматирования, можно использовать селектор для применения формата “General” ко всем столбцам (или ко всем нетемпоральным столбцам, чтобы сохранить форматирование столбцов с датами и датой-временем), например:
column_formats={~cs.temporal(): "General"}.
Примеры
Создание простого DataFrame:
>>> from random import uniform >>> from datetime import date >>> >>> df = pl.DataFrame( ... { ... "dtm": [date(2023, 1, 1), date(2023, 1, 2), date(2023, 1, 3)], ... "num": [uniform(-500, 500), uniform(-500, 500), uniform(-500, 500)], ... "val": [10_000, 20_000, 30_000], ... } ... )Экспорт в “dataframe.xlsx” (имя книги по умолчанию, если не задано другое) в рабочем каталоге, добавление итогов по столбцам для всех числовых столбцов (по умолчанию “sum”), затем автоматический подбор ширины столбцов:
>>> df.write_excel(column_totals=True, autofit=True)
Запись кадра в заданное место листа, применение именованного стиля таблицы и американского формата даты, увеличение точности форматирования чисел с плавающей точкой, применение нестандартной функции вычисления итогов для указанного столбца, автоматический подбор ширины столбцов:
>>> df.write_excel( ... position="B4", ... table_style="Table Style Light 16", ... dtype_formats={pl.Date: "mm/dd/yyyy"}, ... column_totals={"num": "average"}, ... float_precision=6, ... autofit=True, ... )Двукратная запись одного кадра на именованный лист с применением разных стилей и условного форматирования к каждой таблице, а также добавлением заголовков таблиц с пользовательским форматированием и явной интеграцией
xlsxwriter:>>> from xlsxwriter import Workbook >>> with Workbook("multi_frame.xlsx") as wb: ... # basic/default conditional formatting ... df.write_excel( ... workbook=wb, ... worksheet="data", ... position=(3, 1), # specify position as (row,col) coordinates ... conditional_formats={"num": "3_color_scale", "val": "data_bar"}, ... table_style="Table Style Medium 4", ... ) ... ... # advanced conditional formatting, custom styles ... df.write_excel( ... workbook=wb, ... worksheet="data", ... position=(df.height + 7, 1), ... table_style={ ... "style": "Table Style Light 4", ... "first_column": True, ... }, ... conditional_formats={ ... "num": { ... "type": "3_color_scale", ... "min_color": "#76933c", ... "mid_color": "#c4d79b", ... "max_color": "#ebf1de", ... }, ... "val": { ... "type": "data_bar", ... "data_bar_2010": True, ... "bar_color": "#9bbb59", ... "bar_negative_color_same": True, ... "bar_negative_border_color_same": True, ... }, ... }, ... column_formats={"num": "#,##0.000;[White]-#,##0.000"}, ... column_widths={"val": 125}, ... autofit=True, ... ) ... ... # add some table titles (with a custom format) ... ws = wb.get_worksheet_by_name("data") ... fmt_title = wb.add_format( ... { ... "font_color": "#4f6228", ... "font_size": 12, ... "italic": True, ... "bold": True, ... } ... ) ... ws.write(2, 1, "Basic/default conditional formatting", fmt_title) ... ws.write(df.height + 6, 1, "Custom conditional formatting", fmt_title)Экспорт таблицы с двумя разными типами спарклайнов. Для спарклайна “trend” используются параметры по умолчанию, а для спарклайна “+/-”
win_loss— настроенные параметры и положение; также применяются нестандартный целочисленный формат, итоги по столбцам и ненавязчивая двухцветная тепловая карта, а линии сетки листа скрываются:>>> df = pl.DataFrame( ... { ... "id": ["aaa", "bbb", "ccc", "ddd", "eee"], ... "q1": [100, 55, -20, 0, 35], ... "q2": [30, -10, 15, 60, 20], ... "q3": [-50, 0, 40, 80, 80], ... "q4": [75, 55, 25, -10, -55], ... } ... ) >>> df.write_excel( ... table_style="Table Style Light 2", ... # apply accounting format to all flavours of integer ... dtype_formats={dt: "#,##0_);(#,##0)" for dt in [pl.Int32, pl.Int64]}, ... sparklines={ ... # default options; just provide source cols ... "trend": ["q1", "q2", "q3", "q4"], ... # customized sparkline type, with positioning directive ... "+/-": { ... "columns": ["q1", "q2", "q3", "q4"], ... "insert_after": "id", ... "type": "win_loss", ... }, ... }, ... conditional_formats={ ... # create a unified multi-column heatmap ... ("q1", "q2", "q3", "q4"): { ... "type": "2_color_scale", ... "min_color": "#95b3d7", ... "max_color": "#ffffff", ... }, ... }, ... column_totals=["q1", "q2", "q3", "q4"], ... row_totals=True, ... hide_gridlines=True, ... )Экспорт таблицы со столбцом на основе формулы Excel для вычисления стандартизованной Z-оценки; демонстрируется использование структурированных ссылок вместе с указанием положения, итогами по столбцам и пользовательским форматированием.
>>> df = pl.DataFrame( ... { ... "id": ["a123", "b345", "c567", "d789", "e101"], ... "points": [99, 45, 50, 85, 35], ... } ... ) >>> df.write_excel( ... table_style={ ... "style": "Table Style Medium 15", ... "first_column": True, ... }, ... column_formats={ ... "id": {"font": "Consolas"}, ... "points": {"align": "center"}, ... "z-score": {"align": "center"}, ... }, ... column_totals="average", ... formulas={ ... "z-score": { ... # use structured references to refer to the table columns and 'totals' row ... "formula": "=STANDARDIZE([@points], [[#Totals],[points]], STDEV([points]))", ... "insert_after": "points", ... "return_dtype": pl.Float64, ... } ... }, ... hide_gridlines=True, ... sheet_zoom=125, ... )Создание объекта Worksheet и прямое обращение к нему, добавление простой диаграммы. Настоятельно рекомендуется использовать структурированные ссылки для задания значений и категорий рядов диаграммы, чтобы не вычислять позиции ячеек относительно данных кадра и листа:
>>> with Workbook("basic_chart.xlsx") as wb: ... # create worksheet object and write frame data to it ... ws = wb.add_worksheet("demo") ... df.write_excel( ... workbook=wb, ... worksheet=ws, ... table_name="DataTable", ... table_style="Table Style Medium 26", ... hide_gridlines=True, ... ) ... # create chart object, point to the written table ... # data using structured references, and style it ... chart = wb.add_chart({"type": "column"}) ... chart.set_title({"name": "Example Chart"}) ... chart.set_legend({"none": True}) ... chart.set_style(38) ... chart.add_series( ... { # note the use of structured references ... "values": "=DataTable[points]", ... "categories": "=DataTable[id]", ... "data_labels": {"value": True}, ... } ... ) ... # add chart to the worksheet ... ws.insert_chart("D1", chart)Экспорт почти полностью неформатированных данных (без числового форматирования и стандартной точности для чисел с плавающей точкой), отключение автофильтра при сохранении форматирования дат и значений дата-время:
>>> import polars.selectors as cs >>> df = pl.DataFrame( ... { ... "n1": [-100, None, 200, 555], ... "n2": [987.4321, -200, 44.444, 555.5], ... } ... ) >>> df.write_excel( ... column_formats={~cs.temporal(): "General"}, ... autofilter=False, ... )
write_excel( workbook: str | Workbook | IO[bytes] | Path | None = None, worksheet: str | Worksheet | None = None, *, position: tuple[int, int] | str = 'A1', table_style: str | dict[str, Any] | None = None, table_name: str | None = None, column_formats: ColumnFormatDict | None = None, dtype_formats: dict[OneOrMoreDataTypes, str] | None = None, conditional_formats: ConditionalFormatDict | None = None, header_format: dict[str, Any] | None = None, column_totals: ColumnTotalsDefinition | None = None, column_widths: ColumnWidthsDefinition | None = None, row_totals: RowTotalsDefinition | None = None, row_heights: dict[int | tuple[int, ...], int] | int | None = None, sparklines: dict[str, Sequence[str] | dict[str, Any]] | None = None, formulas: dict[str, str | dict[str, str]] | None = None, float_precision: int = 3, include_header: bool = True, autofilter: bool = True, autofit: bool = False, hidden_columns: Sequence[str] | SelectorType | None = None, hide_gridlines: bool = False, sheet_zoom: int | None = None, freeze_panes: str | tuple[int, int] | tuple[str, int, int] | tuple[int, int, int, int] | None = None, use_zip64: bool = False, ) → Workbook-
Записать DataFrame в таблицу Iceberg.
Предупреждение
В настоящее время эта функциональность считается нестабильной. Она может быть изменена в любой момент без того, чтобы это считалось нарушением обратной совместимости.
- Параметры:
-
- target
-
Имя таблицы или объект Table, представляющий таблицу Iceberg.
-
mode{‘append’, ‘overwrite’} -
Способ обработки существующих данных.
- Если задано ‘append’, будут добавлены новые данные.
- Если задано ‘overwrite’, таблица будет заменена новыми данными.
write_iceberg( target: str | pyiceberg.table.Table, mode: Literal['append', 'overwrite'], ) → None-
-
Записать в двоичный поток Arrow IPC или файл Feather.
См. «Формат файла или произвольного доступа» в https://arrow.apache.org/docs/python/ipc.html.
Изменено в версии 1.1: Параметр
futureбыл переименован вcompat_level.- Параметры:
-
- file
-
Путь или доступный для записи файловый объект, в который будут записаны данные IPC. Если задано значение
None, результат возвращается в виде объекта BytesIO. -
compression{‘uncompressed’, ‘lz4’, ‘zstd’} -
Метод сжатия. По умолчанию — «uncompressed».
- compat_level
-
Использовать определённый уровень совместимости при экспорте внутренних структур данных Polars.
- record_batch_size
-
Размер пакетов записей в количестве строк.
Предупреждение
Эта функциональность считается нестабильной. Она может быть изменена в любой момент без того, чтобы это считалось нарушением обратной совместимости.
- storage_options
-
Параметры, указывающие способ подключения к облачному провайдеру.
В настоящее время поддерживаются облачные провайдеры AWS, GCP и Azure. Поддерживаемые ключи приведены здесь:
- aws
- gcp
- azure
- Hugging Face (
hf://): принимает ключ API в параметреtoken:{'token': '...'}или через переменную окруженияHF_TOKEN.
Если
storage_optionsне указан, Polars попытается получить эту информацию из переменных окружения. - credential_provider
-
Функция, которую можно вызвать для получения учётных данных облачного хранилища. Функция должна возвращать словарь с ключами учётных данных и необязательным временем истечения срока их действия.
Предупреждение
Эта функциональность считается нестабильной. Она может быть изменена в любой момент без того, чтобы это считалось нарушением обратной совместимости.
- retries
-
Количество повторных попыток при сбое доступа к облачному экземпляру.
Устарело с версии 1.37.1: Вместо этого передайте {“max_retries”: n} через
storage_options.
Примеры
>>> import pathlib >>> >>> df = pl.DataFrame( ... { ... "foo": [1, 2, 3, 4, 5], ... "bar": [6, 7, 8, 9, 10], ... "ham": ["a", "b", "c", "d", "e"], ... } ... ) >>> path: pathlib.Path = dirpath / "new_file.arrow" >>> df.write_ipc(path)Запишите данные в объект
BytesIO, передавfile=None. Позиция возвращённого буфера находится в конце записанных данных, поэтому перед чтением вызовитеseek(0).>>> buf = df.write_ipc(file=None) >>> buf.seek(0) 0 >>> pl.read_ipc(buf).equals(df) True
write_ipc( file: str | Path | IO[bytes] | None, *, compression: IpcCompression = 'uncompressed', compat_level: CompatLevel | None = None, record_batch_size: int | None = None, storage_options: StorageOptionsDict | None = None, credential_provider: CredentialProviderFunction | Literal['auto'] | None = 'auto', retries: int | None = None, ) → BytesIO | None-
Записать в поток пакетов записей Arrow IPC.
См. «Потоковый формат» в https://arrow.apache.org/docs/python/ipc.html.
Изменено в версии 1.1: Параметр
futureбыл переименован вcompat_level.- Параметры:
-
- file
-
Путь или доступный для записи файловый объект, в который будут записаны данные пакетов записей IPC. Если задано значение
None, результат возвращается в виде объекта BytesIO. -
compression{‘uncompressed’, ‘lz4’, ‘zstd’} -
Метод сжатия. По умолчанию — «uncompressed».
- compat_level
-
Использовать определённый уровень совместимости при экспорте внутренних структур данных Polars.
Примеры
>>> import pathlib >>> >>> df = pl.DataFrame( ... { ... "foo": [1, 2, 3, 4, 5], ... "bar": [6, 7, 8, 9, 10], ... "ham": ["a", "b", "c", "d", "e"], ... } ... ) >>> path: pathlib.Path = dirpath / "new_file.arrow" >>> df.write_ipc_stream(path)
write_ipc_stream( file: str | Path | IO[bytes] | None, *, compression: IpcCompression = 'uncompressed', compat_level: CompatLevel | None = None, ) → BytesIO | None-
Сериализовать в представление JSON.
- Параметры:
-
- file
-
Путь к файлу или доступный для записи файловый объект, в который будет записан результат. Если задано значение
None(по умолчанию), результат возвращается в виде строки.
См. также
Примеры
>>> df = pl.DataFrame( ... { ... "foo": [1, 2, 3], ... "bar": [6, 7, 8], ... } ... ) >>> df.write_json() '[{"foo":1,"bar":6},{"foo":2,"bar":7},{"foo":3,"bar":8}]'
write_json( file: IOBase | str | Path | None = None, ) → str | None-
Сериализовать в построчное представление JSON.
- Параметры:
-
- file
-
Путь к файлу или доступный для записи файловый объект, в который будет записан результат. Если задано значение
None(по умолчанию), результат возвращается в виде строки. - compression
-
Формат сжатия.
Предупреждение
Эта функциональность считается нестабильной. Она может быть изменена в любой момент без того, чтобы это считалось нарушением обратной совместимости.
- compression_level
-
Уровень сжатия: обычно от 0 до 9 или
None, чтобы позволить движку выбрать значение.Предупреждение
Эта функциональность считается нестабильной. Она может быть изменена в любой момент без того, чтобы это считалось нарушением обратной совместимости.
- check_extension
-
Проверять, соответствует ли имя файла настройкам сжатия. Будет вызвана ошибка, если сжатие задано как ‘uncompressed’, а имя файла заканчивается одним из суффиксов (“.gz”, “.zst”, “.zstd”), либо если compression != ‘uncompressed’ и расширение файла не соответствует настройкам. Применяется только в том случае, если file — это путь.
Предупреждение
Эта функциональность считается нестабильной. Она может быть изменена в любой момент без того, чтобы это считалось нарушением обратной совместимости.
Примеры
>>> df = pl.DataFrame( ... { ... "foo": [1, 2, 3], ... "bar": [6, 7, 8], ... } ... ) >>> df.write_ndjson() '{"foo":1,"bar":6}\n{"foo":2,"bar":7}\n{"foo":3,"bar":8}\n'
write_ndjson( file: str | Path | IO[bytes] | IO[str] | None = None, *, compression: Literal['uncompressed', 'gzip', 'zstd'] = 'uncompressed', compression_level: int | None = None, check_extension: bool = True, ) → str | None-
Записать в файл Apache Parquet.
- Параметры:
-
- file
-
Путь к файлу или доступный для записи файловый объект, в который будет записан результат. При записи секционированного набора данных здесь должен быть указан путь к каталогу.
-
compression{‘lz4’, ‘uncompressed’, ‘snappy’, ‘gzip’, ‘brotli’, ‘zstd’} -
Выберите “zstd” для хорошей производительности сжатия. Выберите “lz4” для быстрого сжатия и распаковки. Выберите “snappy” для большей гарантии обратной совместимости при работе со старыми средствами чтения Parquet.
- compression_level
-
Уровень сжатия. Чем выше уровень сжатия, тем меньше размер файлов на диске.
- “gzip” : минимальный уровень: 0, максимальный уровень: 9, по умолчанию: 6.
- “brotli” : минимальный уровень: 0, максимальный уровень: 11, по умолчанию: 1.
- “zstd” : минимальный уровень: 1, максимальный уровень: 22, по умолчанию: 3.
- statistics
-
Записывать статистику в заголовки Parquet. Это поведение используется по умолчанию.
Возможные значения:
-
True: включить стандартный набор статистики (по умолчанию). Некоторые статистические данные могут быть отключены. -
False: отключить всю статистику - “full”: вычислить и записать всю доступную статистику. Нельзя использовать вместе с
use_pyarrow. -
{ "statistic-key": True / False, ... }. Нельзя использовать вместе сuse_pyarrow. Доступные ключи:- “min”: минимальное значение столбца (по умолчанию:
True) - “max”: максимальное значение столбца (по умолчанию:
True) - “distinct_count”: количество уникальных значений столбца (по умолчанию:
False) - “null_count”: количество null-значений в столбце (по умолчанию:
True)
- “min”: минимальное значение столбца (по умолчанию:
-
- row_group_size
-
Размер групп строк в количестве строк. По умолчанию — 512^2 строк.
- data_page_size
-
Размер страницы данных в байтах. По умолчанию — 1024^2 байт.
- use_pyarrow
-
Использовать реализацию Parquet на C++ из PyArrow вместо нативной реализации Polars на Rust. Это может пригодиться, если нужны определённые функции PyArrow через
pyarrow_options. При включении этого параметра некоторые возможности не поддерживаются (например,statistics="full",metadata,mkdir). - pyarrow_options
-
Аргументы, передаваемые в
pyarrow.parquet.write_table.Если передать сюда
partition_cols, набор данных будет записан с помощьюpyarrow.parquet.write_to_dataset. Параметрpartition_colsприводит к записи набора данных в каталог. Аналогично секционированным наборам данных Spark. Для нативной записи с секционированием рассмотрите возможность использованияpartition_by. - partition_by
-
Столбец или столбцы, по которым нужно выполнить секционирование. Если этот параметр указан, будет записан секционированный набор данных. Этот параметр считается нестабильным и может измениться.
- partition_chunk_size_bytes
-
Приблизительный размер для разделения DataFrame внутри одного раздела при записи. Обратите внимание: значение рассчитывается по размеру DataFrame в памяти; размер выходного файла может отличаться в зависимости от формата файла и сжатия.
- storage_options
-
Параметры, указывающие способ подключения к облачному провайдеру.
В настоящее время поддерживаются облачные провайдеры AWS, GCP и Azure. Поддерживаемые ключи приведены здесь:
- aws
- gcp
- azure
- Hugging Face (
hf://): принимает ключ API в параметреtoken:{'token': '...'}или через переменную окруженияHF_TOKEN.
Если
storage_optionsне указан, Polars попытается получить эту информацию из переменных окружения. - credential_provider
-
Функция, которую можно вызвать для получения учётных данных облачного хранилища. Функция должна возвращать словарь с ключами учётных данных и необязательным временем истечения срока их действия.
Предупреждение
Эта функциональность считается нестабильной. Она может быть изменена в любой момент без того, чтобы это считалось нарушением обратной совместимости.
- retries
-
Количество повторных попыток при сбое доступа к облачному экземпляру.
Устарело с версии 1.37.1: Вместо этого передайте {“max_retries”: n} через
storage_options. - metadata
-
Словарь или функция обратного вызова для добавления пар «ключ — значение» в метаданные Parquet на уровне файла.
Предупреждение
Эта функциональность считается экспериментальной. Она может быть удалена или изменена в любой момент без того, чтобы это считалось нарушением обратной совместимости.
- arrow_schema
-
Пользовательская схема Arrow для записи в файл. Это позволяет задать пользовательскую схему и метаданные на уровне полей. Имена и типы данных должны совпадать.
Предупреждение
Эта функциональность считается нестабильной. Она может быть изменена в любой момент без того, чтобы это считалось нарушением обратной совместимости.
- mkdir: bool
-
Рекурсивно создать все каталоги по указанному пути.
Предупреждение
Эта функциональность считается нестабильной. Она может быть изменена в любой момент без того, чтобы это считалось нарушением обратной совместимости.
Примеры
>>> import pathlib >>> >>> df = pl.DataFrame( ... { ... "foo": [1, 2, 3, 4, 5], ... "bar": [6, 7, 8, 9, 10], ... "ham": ["a", "b", "c", "d", "e"], ... } ... ) >>> path: pathlib.Path = dirpath / "new_file.parquet" >>> df.write_parquet(path)Можно записывать секционированные наборы данных. В следующем примере первая строка будет записана в ../watermark=1/.parquet, а остальные строки — в ../watermark=2/.parquet.
>>> df = pl.DataFrame({"a": [1, 2, 3], "watermark": [1, 2, 2]}) >>> path: pathlib.Path = dirpath / "partitioned_object" >>> df.write_parquet( ... path, ... partition_by=["watermark"], ... )
write_parquet( file: str | Path | IO[bytes], *, compression: ParquetCompression = 'zstd', compression_level: int | None = None, statistics: bool | str | dict[str, bool] = True, row_group_size: int | None = None, data_page_size: int | None = None, use_pyarrow: bool = False, pyarrow_options: dict[str, Any] | None = None, partition_by: str | Sequence[str] | None = None, partition_chunk_size_bytes: int = 4294967296, storage_options: StorageOptionsDict | None = None, credential_provider: CredentialProviderFunction | Literal['auto'] | None = 'auto', retries: int | None = None, metadata: ParquetMetadata | None = None, arrow_schema: ArrowSchemaExportable | None = None, mkdir: bool = False, ) → None-
© 2020 Ritchie Vink
© 2022 Polars contributors
Licensed under the MIT License.
https://docs.pola.rs/api/python/stable/reference/dataframe/index.html