Skip to content

Commit 3439327

Browse files
authored
TST: collect .insert tests (#32909)
1 parent dc2b74e commit 3439327

File tree

5 files changed

+174
-142
lines changed

5 files changed

+174
-142
lines changed
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
"""
2+
test_insert is specifically for the DataFrame.insert method; not to be
3+
confused with tests with "insert" in their names that are really testing
4+
__setitem__.
5+
"""
6+
import numpy as np
7+
import pytest
8+
9+
from pandas import DataFrame, Index
10+
import pandas._testing as tm
11+
12+
13+
class TestDataFrameInsert:
14+
def test_insert(self):
15+
df = DataFrame(
16+
np.random.randn(5, 3), index=np.arange(5), columns=["c", "b", "a"]
17+
)
18+
19+
df.insert(0, "foo", df["a"])
20+
tm.assert_index_equal(df.columns, Index(["foo", "c", "b", "a"]))
21+
tm.assert_series_equal(df["a"], df["foo"], check_names=False)
22+
23+
df.insert(2, "bar", df["c"])
24+
tm.assert_index_equal(df.columns, Index(["foo", "c", "bar", "b", "a"]))
25+
tm.assert_almost_equal(df["c"], df["bar"], check_names=False)
26+
27+
with pytest.raises(ValueError, match="already exists"):
28+
df.insert(1, "a", df["b"])
29+
30+
msg = "cannot insert c, already exists"
31+
with pytest.raises(ValueError, match=msg):
32+
df.insert(1, "c", df["b"])
33+
34+
df.columns.name = "some_name"
35+
# preserve columns name field
36+
df.insert(0, "baz", df["c"])
37+
assert df.columns.name == "some_name"
38+
39+
def test_insert_column_bug_4032(self):
40+
41+
# GH#4032, inserting a column and renaming causing errors
42+
df = DataFrame({"b": [1.1, 2.2]})
43+
44+
df = df.rename(columns={})
45+
df.insert(0, "a", [1, 2])
46+
result = df.rename(columns={})
47+
48+
str(result)
49+
expected = DataFrame([[1, 1.1], [2, 2.2]], columns=["a", "b"])
50+
tm.assert_frame_equal(result, expected)
51+
52+
df.insert(0, "c", [1.3, 2.3])
53+
result = df.rename(columns={})
54+
55+
str(result)
56+
expected = DataFrame([[1.3, 1, 1.1], [2.3, 2, 2.2]], columns=["c", "a", "b"])
57+
tm.assert_frame_equal(result, expected)
58+
59+
def test_insert_with_columns_dups(self):
60+
# GH#14291
61+
df = DataFrame()
62+
df.insert(0, "A", ["g", "h", "i"], allow_duplicates=True)
63+
df.insert(0, "A", ["d", "e", "f"], allow_duplicates=True)
64+
df.insert(0, "A", ["a", "b", "c"], allow_duplicates=True)
65+
exp = DataFrame(
66+
[["a", "d", "g"], ["b", "e", "h"], ["c", "f", "i"]], columns=["A", "A", "A"]
67+
)
68+
tm.assert_frame_equal(df, exp)

pandas/tests/frame/test_mutate_columns.py

Lines changed: 5 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@
33
import numpy as np
44
import pytest
55

6-
from pandas import DataFrame, Index, MultiIndex, Series
6+
from pandas import DataFrame, MultiIndex, Series
77
import pandas._testing as tm
88

99
# Column add, remove, delete.
1010

1111

1212
class TestDataFrameMutateColumns:
13-
def test_insert_error_msmgs(self):
13+
def test_setitem_error_msmgs(self):
1414

1515
# GH 7432
1616
df = DataFrame(
@@ -30,7 +30,7 @@ def test_insert_error_msmgs(self):
3030
with pytest.raises(TypeError, match=msg):
3131
df["gr"] = df.groupby(["b", "c"]).count()
3232

33-
def test_insert_benchmark(self):
33+
def test_setitem_benchmark(self):
3434
# from the vb_suite/frame_methods/frame_insert_columns
3535
N = 10
3636
K = 5
@@ -41,18 +41,12 @@ def test_insert_benchmark(self):
4141
expected = DataFrame(np.repeat(new_col, K).reshape(N, K), index=range(N))
4242
tm.assert_frame_equal(df, expected)
4343

44-
def test_insert(self):
44+
def test_setitem_different_dtype(self):
4545
df = DataFrame(
4646
np.random.randn(5, 3), index=np.arange(5), columns=["c", "b", "a"]
4747
)
48-
4948
df.insert(0, "foo", df["a"])
50-
tm.assert_index_equal(df.columns, Index(["foo", "c", "b", "a"]))
51-
tm.assert_series_equal(df["a"], df["foo"], check_names=False)
52-
5349
df.insert(2, "bar", df["c"])
54-
tm.assert_index_equal(df.columns, Index(["foo", "c", "bar", "b", "a"]))
55-
tm.assert_almost_equal(df["c"], df["bar"], check_names=False)
5650

5751
# diff dtype
5852

@@ -82,17 +76,7 @@ def test_insert(self):
8276
)
8377
tm.assert_series_equal(result, expected)
8478

85-
with pytest.raises(ValueError, match="already exists"):
86-
df.insert(1, "a", df["b"])
87-
msg = "cannot insert c, already exists"
88-
with pytest.raises(ValueError, match=msg):
89-
df.insert(1, "c", df["b"])
90-
91-
df.columns.name = "some_name"
92-
# preserve columns name field
93-
df.insert(0, "baz", df["c"])
94-
assert df.columns.name == "some_name"
95-
79+
def test_setitem_empty_columns(self):
9680
# GH 13522
9781
df = DataFrame(index=["A", "B", "C"])
9882
df["X"] = df.index
@@ -165,22 +149,3 @@ def test_pop_non_unique_cols(self):
165149
assert "b" in df.columns
166150
assert "a" not in df.columns
167151
assert len(df.index) == 2
168-
169-
def test_insert_column_bug_4032(self):
170-
171-
# GH4032, inserting a column and renaming causing errors
172-
df = DataFrame({"b": [1.1, 2.2]})
173-
df = df.rename(columns={})
174-
df.insert(0, "a", [1, 2])
175-
176-
result = df.rename(columns={})
177-
str(result)
178-
expected = DataFrame([[1, 1.1], [2, 2.2]], columns=["a", "b"])
179-
tm.assert_frame_equal(result, expected)
180-
df.insert(0, "c", [1.3, 2.3])
181-
182-
result = df.rename(columns={})
183-
str(result)
184-
185-
expected = DataFrame([[1.3, 1, 1.1], [2.3, 2, 2.2]], columns=["c", "a", "b"])
186-
tm.assert_frame_equal(result, expected)

pandas/tests/frame/test_nonunique_indexes.py

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -513,14 +513,3 @@ def test_set_value_by_index(self):
513513

514514
df.iloc[:, 0] = 3
515515
tm.assert_series_equal(df.iloc[:, 1], expected)
516-
517-
def test_insert_with_columns_dups(self):
518-
# GH 14291
519-
df = pd.DataFrame()
520-
df.insert(0, "A", ["g", "h", "i"], allow_duplicates=True)
521-
df.insert(0, "A", ["d", "e", "f"], allow_duplicates=True)
522-
df.insert(0, "A", ["a", "b", "c"], allow_duplicates=True)
523-
exp = pd.DataFrame(
524-
[["a", "d", "g"], ["b", "e", "h"], ["c", "f", "i"]], columns=["A", "A", "A"]
525-
)
526-
tm.assert_frame_equal(df, exp)

pandas/tests/indexes/timedeltas/test_indexing.py

Lines changed: 0 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -189,97 +189,6 @@ def test_take_fill_value(self):
189189

190190

191191
class TestTimedeltaIndex:
192-
def test_insert_empty(self):
193-
# Corner case inserting with length zero doesnt raise IndexError
194-
idx = timedelta_range("1 Day", periods=3)
195-
td = idx[0]
196-
197-
idx[:0].insert(0, td)
198-
idx[:0].insert(1, td)
199-
idx[:0].insert(-1, td)
200-
201-
def test_insert(self):
202-
203-
idx = TimedeltaIndex(["4day", "1day", "2day"], name="idx")
204-
205-
result = idx.insert(2, timedelta(days=5))
206-
exp = TimedeltaIndex(["4day", "1day", "5day", "2day"], name="idx")
207-
tm.assert_index_equal(result, exp)
208-
209-
# insertion of non-datetime should coerce to object index
210-
result = idx.insert(1, "inserted")
211-
expected = Index(
212-
[Timedelta("4day"), "inserted", Timedelta("1day"), Timedelta("2day")],
213-
name="idx",
214-
)
215-
assert not isinstance(result, TimedeltaIndex)
216-
tm.assert_index_equal(result, expected)
217-
assert result.name == expected.name
218-
219-
idx = timedelta_range("1day 00:00:01", periods=3, freq="s", name="idx")
220-
221-
# preserve freq
222-
expected_0 = TimedeltaIndex(
223-
["1day", "1day 00:00:01", "1day 00:00:02", "1day 00:00:03"],
224-
name="idx",
225-
freq="s",
226-
)
227-
expected_3 = TimedeltaIndex(
228-
["1day 00:00:01", "1day 00:00:02", "1day 00:00:03", "1day 00:00:04"],
229-
name="idx",
230-
freq="s",
231-
)
232-
233-
# reset freq to None
234-
expected_1_nofreq = TimedeltaIndex(
235-
["1day 00:00:01", "1day 00:00:01", "1day 00:00:02", "1day 00:00:03"],
236-
name="idx",
237-
freq=None,
238-
)
239-
expected_3_nofreq = TimedeltaIndex(
240-
["1day 00:00:01", "1day 00:00:02", "1day 00:00:03", "1day 00:00:05"],
241-
name="idx",
242-
freq=None,
243-
)
244-
245-
cases = [
246-
(0, Timedelta("1day"), expected_0),
247-
(-3, Timedelta("1day"), expected_0),
248-
(3, Timedelta("1day 00:00:04"), expected_3),
249-
(1, Timedelta("1day 00:00:01"), expected_1_nofreq),
250-
(3, Timedelta("1day 00:00:05"), expected_3_nofreq),
251-
]
252-
253-
for n, d, expected in cases:
254-
result = idx.insert(n, d)
255-
tm.assert_index_equal(result, expected)
256-
assert result.name == expected.name
257-
assert result.freq == expected.freq
258-
259-
@pytest.mark.parametrize(
260-
"null", [None, np.nan, np.timedelta64("NaT"), pd.NaT, pd.NA]
261-
)
262-
def test_insert_nat(self, null):
263-
# GH 18295 (test missing)
264-
idx = timedelta_range("1day", "3day")
265-
result = idx.insert(1, null)
266-
expected = TimedeltaIndex(["1day", pd.NaT, "2day", "3day"])
267-
tm.assert_index_equal(result, expected)
268-
269-
def test_insert_invalid_na(self):
270-
idx = TimedeltaIndex(["4day", "1day", "2day"], name="idx")
271-
with pytest.raises(TypeError, match="incompatible label"):
272-
idx.insert(0, np.datetime64("NaT"))
273-
274-
def test_insert_dont_cast_strings(self):
275-
# To match DatetimeIndex and PeriodIndex behavior, dont try to
276-
# parse strings to Timedelta
277-
idx = timedelta_range("1day", "3day")
278-
279-
result = idx.insert(0, "1 Day")
280-
assert result.dtype == object
281-
assert result[0] == "1 Day"
282-
283192
def test_delete(self):
284193
idx = timedelta_range(start="1 Days", periods=5, freq="D", name="idx")
285194

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
from datetime import timedelta
2+
3+
import numpy as np
4+
import pytest
5+
6+
import pandas as pd
7+
from pandas import Index, Timedelta, TimedeltaIndex, timedelta_range
8+
import pandas._testing as tm
9+
10+
11+
class TestTimedeltaIndexInsert:
12+
def test_insert(self):
13+
14+
idx = TimedeltaIndex(["4day", "1day", "2day"], name="idx")
15+
16+
result = idx.insert(2, timedelta(days=5))
17+
exp = TimedeltaIndex(["4day", "1day", "5day", "2day"], name="idx")
18+
tm.assert_index_equal(result, exp)
19+
20+
# insertion of non-datetime should coerce to object index
21+
result = idx.insert(1, "inserted")
22+
expected = Index(
23+
[Timedelta("4day"), "inserted", Timedelta("1day"), Timedelta("2day")],
24+
name="idx",
25+
)
26+
assert not isinstance(result, TimedeltaIndex)
27+
tm.assert_index_equal(result, expected)
28+
assert result.name == expected.name
29+
30+
idx = timedelta_range("1day 00:00:01", periods=3, freq="s", name="idx")
31+
32+
# preserve freq
33+
expected_0 = TimedeltaIndex(
34+
["1day", "1day 00:00:01", "1day 00:00:02", "1day 00:00:03"],
35+
name="idx",
36+
freq="s",
37+
)
38+
expected_3 = TimedeltaIndex(
39+
["1day 00:00:01", "1day 00:00:02", "1day 00:00:03", "1day 00:00:04"],
40+
name="idx",
41+
freq="s",
42+
)
43+
44+
# reset freq to None
45+
expected_1_nofreq = TimedeltaIndex(
46+
["1day 00:00:01", "1day 00:00:01", "1day 00:00:02", "1day 00:00:03"],
47+
name="idx",
48+
freq=None,
49+
)
50+
expected_3_nofreq = TimedeltaIndex(
51+
["1day 00:00:01", "1day 00:00:02", "1day 00:00:03", "1day 00:00:05"],
52+
name="idx",
53+
freq=None,
54+
)
55+
56+
cases = [
57+
(0, Timedelta("1day"), expected_0),
58+
(-3, Timedelta("1day"), expected_0),
59+
(3, Timedelta("1day 00:00:04"), expected_3),
60+
(1, Timedelta("1day 00:00:01"), expected_1_nofreq),
61+
(3, Timedelta("1day 00:00:05"), expected_3_nofreq),
62+
]
63+
64+
for n, d, expected in cases:
65+
result = idx.insert(n, d)
66+
tm.assert_index_equal(result, expected)
67+
assert result.name == expected.name
68+
assert result.freq == expected.freq
69+
70+
@pytest.mark.parametrize(
71+
"null", [None, np.nan, np.timedelta64("NaT"), pd.NaT, pd.NA]
72+
)
73+
def test_insert_nat(self, null):
74+
# GH 18295 (test missing)
75+
idx = timedelta_range("1day", "3day")
76+
result = idx.insert(1, null)
77+
expected = TimedeltaIndex(["1day", pd.NaT, "2day", "3day"])
78+
tm.assert_index_equal(result, expected)
79+
80+
def test_insert_invalid_na(self):
81+
idx = TimedeltaIndex(["4day", "1day", "2day"], name="idx")
82+
with pytest.raises(TypeError, match="incompatible label"):
83+
idx.insert(0, np.datetime64("NaT"))
84+
85+
def test_insert_dont_cast_strings(self):
86+
# To match DatetimeIndex and PeriodIndex behavior, dont try to
87+
# parse strings to Timedelta
88+
idx = timedelta_range("1day", "3day")
89+
90+
result = idx.insert(0, "1 Day")
91+
assert result.dtype == object
92+
assert result[0] == "1 Day"
93+
94+
def test_insert_empty(self):
95+
# Corner case inserting with length zero doesnt raise IndexError
96+
idx = timedelta_range("1 Day", periods=3)
97+
td = idx[0]
98+
99+
idx[:0].insert(0, td)
100+
idx[:0].insert(1, td)
101+
idx[:0].insert(-1, td)

0 commit comments

Comments
 (0)