Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
pola-rs
GitHub Repository: pola-rs/polars
Path: blob/main/py-polars/tests/unit/operations/map/test_map_rows.py
6940 views
1
from __future__ import annotations
2
3
from typing import Any
4
5
import pytest
6
7
import polars as pl
8
from polars.exceptions import ComputeError
9
from polars.testing import assert_frame_equal
10
11
12
def test_map_rows() -> None:
13
df = pl.DataFrame({"a": ["foo", "2"], "b": [1, 2], "c": [1.0, 2.0]})
14
15
result = df.map_rows(lambda x: len(x), None)
16
17
expected = pl.DataFrame({"map": [3, 3]})
18
assert_frame_equal(result, expected)
19
20
21
def test_map_rows_list_return() -> None:
22
df = pl.DataFrame({"start": [1, 2], "end": [3, 5]})
23
24
result = df.map_rows(lambda r: pl.Series(range(r[0], r[1] + 1)))
25
26
expected = pl.DataFrame({"map": [[1, 2, 3], [2, 3, 4, 5]]})
27
assert_frame_equal(result, expected)
28
29
30
def test_map_rows_dataframe_return() -> None:
31
df = pl.DataFrame({"a": [1, 2, 3], "b": ["c", "d", None]})
32
33
result = df.map_rows(lambda row: (row[0] * 10, "foo", True, row[-1]))
34
35
expected = pl.DataFrame(
36
{
37
"column_0": [10, 20, 30],
38
"column_1": ["foo", "foo", "foo"],
39
"column_2": [True, True, True],
40
"column_3": ["c", "d", None],
41
}
42
)
43
assert_frame_equal(result, expected)
44
45
46
def test_map_rows_error_return_type() -> None:
47
df = pl.DataFrame({"a": [[1, 2], [2, 3]], "b": [[4, 5], [6, 7]]})
48
49
def combine(row: tuple[Any, ...]) -> list[Any]:
50
res = [x + y for x, y in zip(row[0], row[1])]
51
return [res]
52
53
with pytest.raises(ComputeError, match="expected tuple, got list"):
54
df.map_rows(combine)
55
56
57
def test_map_rows_shifted_chunks() -> None:
58
df = pl.DataFrame(pl.Series("texts", ["test", "test123", "tests"]))
59
df = df.select(pl.col("texts"), pl.col("texts").shift(1).alias("texts_shifted"))
60
61
result = df.map_rows(lambda x: x)
62
63
expected = pl.DataFrame(
64
{
65
"column_0": ["test", "test123", "tests"],
66
"column_1": [None, "test", "test123"],
67
}
68
)
69
assert_frame_equal(result, expected)
70
71
72
def test_map_elements_infer() -> None:
73
lf = pl.LazyFrame(
74
{
75
"a": [1, 2, 3],
76
}
77
)
78
lf = lf.select(pl.col.a.map_elements(lambda v: f"pre-{v}"))
79
80
# this should not go through execution, solely through the planner
81
schema = lf.collect_schema()
82
83
assert schema.names() == ["a"]
84
assert schema.dtypes() == [pl.String]
85
86