Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
pola-rs
GitHub Repository: pola-rs/polars
Path: blob/main/py-polars/tests/unit/dataframe/test_extend.py
6939 views
1
from datetime import datetime
2
3
import pytest
4
5
import polars as pl
6
from polars.exceptions import ShapeError
7
from polars.testing import assert_frame_equal
8
9
10
def test_extend_various_dtypes() -> None:
11
df1 = pl.DataFrame(
12
{
13
"foo": [1, 2],
14
"bar": [True, False],
15
"ham": ["a", "b"],
16
"cat": ["A", "B"],
17
"dates": [datetime(2021, 1, 1), datetime(2021, 2, 1)],
18
},
19
schema_overrides={"cat": pl.Categorical},
20
)
21
df2 = pl.DataFrame(
22
{
23
"foo": [3, 4],
24
"bar": [True, None],
25
"ham": ["c", "d"],
26
"cat": ["C", "B"],
27
"dates": [datetime(2022, 9, 1), datetime(2021, 2, 1)],
28
},
29
schema_overrides={"cat": pl.Categorical},
30
)
31
32
df1.extend(df2)
33
34
expected = pl.DataFrame(
35
{
36
"foo": [1, 2, 3, 4],
37
"bar": [True, False, True, None],
38
"ham": ["a", "b", "c", "d"],
39
"cat": ["A", "B", "C", "B"],
40
"dates": [
41
datetime(2021, 1, 1),
42
datetime(2021, 2, 1),
43
datetime(2022, 9, 1),
44
datetime(2021, 2, 1),
45
],
46
},
47
schema_overrides={"cat": pl.Categorical},
48
)
49
assert_frame_equal(df1, expected)
50
51
52
def test_extend_slice_offset_8745() -> None:
53
df = pl.DataFrame([{"age": 1}, {"age": 2}, {"age": 3}])
54
55
df = df[:-1]
56
tail = pl.DataFrame([{"age": 8}])
57
result = df.extend(tail)
58
59
expected = pl.DataFrame({"age": [1, 2, 8]})
60
assert_frame_equal(result, expected)
61
62
63
def test_extend_self() -> None:
64
df = pl.DataFrame({"a": [1, 2], "b": [True, False]})
65
66
df.extend(df)
67
68
expected = pl.DataFrame({"a": [1, 2, 1, 2], "b": [True, False, True, False]})
69
assert_frame_equal(df, expected)
70
71
72
def test_extend_column_number_mismatch() -> None:
73
df1 = pl.DataFrame({"a": [1, 2], "b": [True, False]})
74
df2 = df1.drop("a")
75
76
with pytest.raises(ShapeError):
77
df1.extend(df2)
78
79
80
def test_extend_column_name_mismatch() -> None:
81
df1 = pl.DataFrame({"a": [1, 2], "b": [True, False]})
82
df2 = df1.with_columns(pl.col("a").alias("c"))
83
84
with pytest.raises(ShapeError):
85
df1.extend(df2)
86
87
88
def test_initialize_df_18736() -> None:
89
# Completely empty initialization
90
df = pl.DataFrame()
91
s_0 = pl.Series([])
92
s_1 = pl.Series([None])
93
s_2 = pl.Series([None, None])
94
assert df.with_columns(s_0).shape == (0, 1)
95
assert df.with_columns(s_1).shape == (1, 1)
96
assert df.with_columns(s_2).shape == (2, 1)
97
98
99
def test_extend_bad_input_type() -> None:
100
a = pl.DataFrame({"x": [1, 2, 3]})
101
b = pl.DataFrame({"x": [4, 5, 6]})
102
103
with pytest.raises(
104
TypeError,
105
match="expected `other` .*to be a 'DataFrame'.* not 'Series'",
106
):
107
a.extend(pl.Series(b)) # type: ignore[arg-type]
108
109
with pytest.raises(
110
TypeError,
111
match="expected `other` .*to be a 'DataFrame'.* not 'LazyFrame'",
112
):
113
a.extend(b.lazy()) # type: ignore[arg-type]
114
115
class DummyDataFrameSubclass(pl.DataFrame):
116
pass
117
118
b = DummyDataFrameSubclass({"x": [4, 5, 6]})
119
120
a.extend(b)
121
122