polars-list-math
polars-list-math helps you work with Polars DataFrames in which every field
of a nested list of structs is represented by its own column. Each field
column preserves the original list nesting, so corresponding values remain
aligned by row and by position at every list level.
For example, a nested list of records with price and qty fields can be
represented as two nested list columns in the same DataFrame:
flowchart LR
records["orders: List[List[Struct]]<br/>[[{price: 10, qty: 2}, {price: 20, qty: 1}],<br/>[{price: 30, qty: 4}]]"]
subgraph columns["Separate field columns — same DataFrame row"]
price["orders.price: List[List[Int64]]<br/>[[10, 20], [30]]"]
qty["orders.qty: List[List[Int64]]<br/>[[2, 1], [4]]"]
end
records -->|price| price
records -->|qty| qty
Each level of lists keeps its grouping, and each field becomes independently accessible as a column. The same representation extends to deeper nesting. The dotted column names above are illustrative.
The library provides Python/Rust helpers for calculations on these list
columns, comparing lists, and combining corresponding fields with
list_zip and ZipBuilder.
It also includes JSON and URL expressions, null-field discovery, and schema
cleaning for preparing and transforming DataFrames and LazyFrames.
Release notes and upgrade guidance are recorded in CHANGELOG.md.
Import the package once to register extra methods on Expr.list and Expr.str:
import polars as pl
import polars_list_math # noqa: F401
For type-checked code, import the top-level expression helpers described below.
Install
pip install polars-list-math
# or
uv add polars-list-math
Requires Python 3.12+ and polars>=1.39.3.
Functions
Top-level functions provide the statically typed API for Pyright, Pylance,
and other type checkers. Where available, the optional Method column lists
an equivalent runtime method registered when the package is imported.
| Function | Method (optional) | Result | Docs |
|---|---|---|---|
list_zip(...) |
Expr.list.zip(...) |
Zip lists into list[struct] |
List zip |
list_combinations(...) |
Expr.list.combinations(...) |
Pair items in one list | Combinations |
list_combinations_to(...) |
Expr.list.combinations_to(...) |
Pair items from two lists | Combinations |
expected_value_of_game(...) |
— | Expected value of a sequential game | Expected value of a game |
list_similarity(...) |
Expr.list.similarity(...) |
Weighted similarity between two lists | Similarity |
list_mean_similarity(...) |
Expr.list.mean_similarity(...) |
Mean similarity inside nested lists | Similarity |
list_mean_similarity_to(...) |
Expr.list.mean_similarity_to(...) |
Mean similarity to reference nested lists | Similarity |
list_containment(...) |
Expr.list.containment(...) |
Fraction of unique IDs found in another list | Containment |
list_mean_containment(...) |
Expr.list.mean_containment(...) |
Mean directed containment against peer lists | Containment |
list_mean_containment_to(...) |
Expr.list.mean_containment_to(...) |
Mean directed containment against reference lists | Containment |
json_object_items(expr, strict=False) |
Expr.str.json_object_items(...) |
Convert a JSON object to list[struct[key, value]] |
JSON object items |
json_array_values(expr, strict=False) |
Expr.str.json_array_values(...) |
Convert a JSON array to list[str] |
JSON array values |
url_query_encode(expr, doseq=False) |
— | Encode a Struct or key/value list as a URL query string | URL query encoding |
url_build(...) |
— | Assemble a URL from optional component expressions | URL building |
dfs_to_lazy_df(...) |
— | Expose DataFrame batches as a pushdown-aware LazyFrame source | Examples |
find_null_schema(lf) |
— | Discover absent columns and nested fields | Null schemas |
clean_schema(schema, subschema) |
— | Remove columns and fields described by a subschema | Null schemas |
apply_schema(lf, schema) |
— | Select and cast a LazyFrame to the cleaned schema | Null schemas |
The Python helper py_list_similarity(...) computes weighted similarity for
plain Python sequences. py_list_containment(...) computes directed set
containment for Python sequences, ignoring ranks and duplicates.
The Expr.list and Expr.str methods are registered dynamically and remain
available as convenient runtime syntax. Python type checkers cannot safely
augment Polars' own namespace classes from another installed package, so use
the equivalent top-level functions in code checked by Pylance or Pyright.
If a future Polars release ships native methods with the same names, this package leaves the native implementation untouched.
Quick Examples
from polars_list_math import (
list_combinations,
list_mean_similarity,
list_similarity,
list_zip,
)
df = pl.DataFrame(
{
"a": [[1, 2, 3]],
"b": [[2, 1, 3]],
"groups": [[[1, 2, 3], [1, 2, 3], [4, 5, 6]]],
}
)
df.with_columns(
list_similarity("a", "b").alias("similarity"),
list_mean_similarity("groups").alias("mean_similarity"),
list_combinations("a").alias("pairs"),
list_zip("a", "b", fields=["a", "b"]).alias("zipped"),
)
Convert JSON strings to nested Polars values. String values stay strings, JSON
null stays null, and other values become compact JSON strings. Invalid JSON
returns null by default; pass strict=True to raise instead.
from polars_list_math import json_array_values, json_object_items
json_df = pl.DataFrame(
{
"object": ['{"name":"Ada","active":true,"note":null}'],
"array": ['["python",42,true,null]'],
}
)
json_df.select(
json_object_items("object").alias("items"),
json_array_values("array").alias("values"),
)
Encode query parameters and build URLs from expressions:
from polars_list_math import url_build, url_query_encode
pages = pl.DataFrame(
{
"host": ["example.com"],
"path": ["/search"],
"term": ["rust polars"],
"page": [2],
}
)
query = url_query_encode(pl.struct(q=pl.col("term"), page=pl.col("page")))
pages.select(
url_build(
scheme=pl.lit("https"),
netloc="host",
path="path",
query=query,
).alias("url")
)
More complete, runnable examples are available in the
examples
directory.
Nested zip builder
ZipBuilder combines nested list columns with zip options and ordered eval/filter
operations at each level. build() returns a normal Polars expression:
from polars_list_math import ZipBuilder
expr = (
ZipBuilder("a", "b")
.level(pad=True)
.filter(pl.element().struct.field("a").is_not_null())
.build("nested_zip")
)
The constructor configures the outer zip; each level() adds one inner zip.
See the builder guide for transformations, broadcasting,
and deeper nesting.
Performance experiments
Reproducible performance experiments live in the performance
directory. Each experiment has its own README with the tested scenario, run
instructions, environment, and recorded results.
The current
dataframe_construction experiment
compares construction of 30-column Polars DataFrames from a regular dataclass,
a slotted dataclass, and a named tuple, including nested structs and lists.
uv run pytest performance/dataframe_construction -v -s
Development
make install
make develop
make test
Build and check the package locally:
make check-dist
Release steps are in docs/publishing.md.
Metadata
Release files for polars-list-math 0.7.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| polars_list_math-0.7.0.tar.gz | 50.6 kB | With provenance | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| polars_list_math-0.7.0-cp313-cp313-win_amd64.whl | CPython 3.13 | CPython 3.13 | Windows x86-64 | Details |
| polars_list_math-0.7.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl | CPython 3.13 | CPython 3.13 | Linux glibc 2.17+ x86-64 | Details |
| polars_list_math-0.7.0-cp313-cp313-macosx_11_0_arm64.whl | CPython 3.13 | CPython 3.13 | macOS 11.0+ ARM64 | Details |
| polars_list_math-0.7.0-cp313-cp313-macosx_10_12_x86_64.whl | CPython 3.13 | CPython 3.13 | macOS 10.12+ x86-64 | Details |
| polars_list_math-0.7.0-cp312-cp312-win_amd64.whl | CPython 3.12 | CPython 3.12 | Windows x86-64 | Details |
| polars_list_math-0.7.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl | CPython 3.12 | CPython 3.12 | Linux glibc 2.17+ x86-64 | Details |
| polars_list_math-0.7.0-cp312-cp312-macosx_11_0_arm64.whl | CPython 3.12 | CPython 3.12 | macOS 11.0+ ARM64 | Details |
| polars_list_math-0.7.0-cp312-cp312-macosx_10_12_x86_64.whl | CPython 3.12 | CPython 3.12 | macOS 10.12+ x86-64 | Details |
Total release size: 39.2 MB
Release files / polars_list_math-0.7.0.tar.gz
| Download URL | polars_list_math-0.7.0.tar.gz |
|---|---|
| Size | 50.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
2de0101aefabb1c1113beb217c1cb5d5edec55e787f06c2191d695dab3e7628a
|
|
BLAKE2b-256 checksum How to use checksums |
da38feeb29f977b4ff22c9f127181e320a4c8ea6473cc103aa864c40a3e82a53
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 19, 2026.
Transparency logRelease files / polars_list_math-0.7.0-cp313-cp313-win_amd64.whl
| Download URL | polars_list_math-0.7.0-cp313-cp313-win_amd64.whl |
|---|---|
| Size | 4.9 MB |
| Tags | CPython 3.13 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
caabf82eb9b46a1aabe51b224a0a65ba8509beaa09ccd1bf33b2e3e92cb12b3a
|
|
BLAKE2b-256 checksum How to use checksums |
dcb161cdae305660f18b2d44f72286ffb99f4b00ea453782b548128748dccefd
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 19, 2026.
Transparency logRelease files / polars_list_math-0.7.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | polars_list_math-0.7.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 5.3 MB |
| Tags | CPython 3.13 Linux glibc 2.17+ x86-64 |
|
SHA-256 checksum How to use checksums |
cf2575c8dccabd564907e1e3ca6af651644be1b62d5453b0f8abfbbf049b5639
|
|
BLAKE2b-256 checksum How to use checksums |
ebcd3328c43b323245af8851f3201e92818a24fb7edde183e89516e6a20f5864
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 19, 2026.
Transparency logRelease files / polars_list_math-0.7.0-cp313-cp313-macosx_11_0_arm64.whl
| Download URL | polars_list_math-0.7.0-cp313-cp313-macosx_11_0_arm64.whl |
|---|---|
| Size | 4.5 MB |
| Tags | CPython 3.13 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
e7b7fee12928fa8781baaaf3318bdf2e2c84910bf20aa6b4c39461c348f4df8f
|
|
BLAKE2b-256 checksum How to use checksums |
8cde8580daedd75cbd15f24bc9f803f58de33ef0eda487aaa5adfe9c85cf1d77
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 19, 2026.
Transparency logRelease files / polars_list_math-0.7.0-cp313-cp313-macosx_10_12_x86_64.whl
| Download URL | polars_list_math-0.7.0-cp313-cp313-macosx_10_12_x86_64.whl |
|---|---|
| Size | 4.8 MB |
| Tags | CPython 3.13 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
6aa2832550c1fd13a8250a8e752a584a4f8c1ffd9d7f6842a0bb2765f83a7910
|
|
BLAKE2b-256 checksum How to use checksums |
d0f20bf35e7f052262350f0bdecd85f5c924537236ec9b28149b30dc83da8eac
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 19, 2026.
Transparency logRelease files / polars_list_math-0.7.0-cp312-cp312-win_amd64.whl
| Download URL | polars_list_math-0.7.0-cp312-cp312-win_amd64.whl |
|---|---|
| Size | 4.9 MB |
| Tags | CPython 3.12 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
43375dc633d91402147737a7f00dcdb27e14bede36e0b1f9a8487198fc892fbb
|
|
BLAKE2b-256 checksum How to use checksums |
49148f1c3ee6859a9d82a78e959955c252277d620f91aeb2cddb71f2cdc832b1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 19, 2026.
Transparency logRelease files / polars_list_math-0.7.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | polars_list_math-0.7.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 5.3 MB |
| Tags | CPython 3.12 Linux glibc 2.17+ x86-64 |
|
SHA-256 checksum How to use checksums |
a507c0eab6d61bd7c2e35bb3414ac6cb218a23fe282926c39592b6cbf0b6fe3e
|
|
BLAKE2b-256 checksum How to use checksums |
6563a97c0228f6fad8741e73b635eb31961a34fc1b7a0badeaeb4d7b17528ecf
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 19, 2026.
Transparency logRelease files / polars_list_math-0.7.0-cp312-cp312-macosx_11_0_arm64.whl
| Download URL | polars_list_math-0.7.0-cp312-cp312-macosx_11_0_arm64.whl |
|---|---|
| Size | 4.5 MB |
| Tags | CPython 3.12 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
adb2112d61feb258dc682bb01fb8dea099bfa582710194faaaa3f71640edcd8b
|
|
BLAKE2b-256 checksum How to use checksums |
0fc1ddd145dbf1b90dc12a4bee5f60fb17995f867a4833ddc985b65aab2c163a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 19, 2026.
Transparency logRelease files / polars_list_math-0.7.0-cp312-cp312-macosx_10_12_x86_64.whl
| Download URL | polars_list_math-0.7.0-cp312-cp312-macosx_10_12_x86_64.whl |
|---|---|
| Size | 4.8 MB |
| Tags | CPython 3.12 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
ec3fb1ffce3437f936439bbc5415b128af38143fd349a0e14666d4149b8cb092
|
|
BLAKE2b-256 checksum How to use checksums |
de562570fd86373a021573869842cbfe0f1f71060ed369ba9d05ae934e429340
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 19, 2026.
Transparency logSecurity for polars-list-math 0.7.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 9 files in this release have been uploaded with provenance metadata.
Attestation for polars_list_math-0.7.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 19, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.