Skip to content

Commit a7402c1

Browse files
authored
TST: collect indexing tests by method (pandas-dev#39876)
1 parent c967731 commit a7402c1

File tree

12 files changed

+312
-360
lines changed

12 files changed

+312
-360
lines changed

pandas/tests/frame/indexing/test_setitem.py

+9
Original file line numberDiff line numberDiff line change
@@ -445,6 +445,15 @@ def test_setitem_intervals(self):
445445
tm.assert_series_equal(df["C"], df["C"])
446446
tm.assert_series_equal(df["C"], df["E"], check_names=False)
447447

448+
def test_setitem_categorical(self):
449+
# GH#35369
450+
df = DataFrame({"h": Series(list("mn")).astype("category")})
451+
df.h = df.h.cat.reorder_categories(["n", "m"])
452+
expected = DataFrame(
453+
{"h": Categorical(["m", "n"]).reorder_categories(["n", "m"])}
454+
)
455+
tm.assert_frame_equal(df, expected)
456+
448457

449458
class TestSetitemTZAwareValues:
450459
@pytest.fixture

pandas/tests/indexing/interval/test_interval_new.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ def test_non_unique_moar(self, indexer_sl):
198198
result = indexer_sl(ser)[[Interval(1, 3)]]
199199
tm.assert_series_equal(expected, result)
200200

201-
def test_missing_key_error_message(
201+
def test_loc_getitem_missing_key_error_message(
202202
self, frame_or_series, series_with_interval_index
203203
):
204204
# GH#27365

pandas/tests/indexing/multiindex/test_getitem.py

+4-8
Original file line numberDiff line numberDiff line change
@@ -62,26 +62,22 @@ def test_series_getitem_duplicates_multiindex(level0_value):
6262
tm.assert_series_equal(result, expected)
6363

6464

65-
@pytest.mark.parametrize("indexer", [lambda s: s[2000, 3], lambda s: s.loc[2000, 3]])
66-
def test_series_getitem(multiindex_year_month_day_dataframe_random_data, indexer):
65+
def test_series_getitem(multiindex_year_month_day_dataframe_random_data, indexer_sl):
6766
s = multiindex_year_month_day_dataframe_random_data["A"]
6867
expected = s.reindex(s.index[42:65])
6968
expected.index = expected.index.droplevel(0).droplevel(0)
7069

71-
result = indexer(s)
70+
result = indexer_sl(s)[2000, 3]
7271
tm.assert_series_equal(result, expected)
7372

7473

75-
@pytest.mark.parametrize(
76-
"indexer", [lambda s: s[2000, 3, 10], lambda s: s.loc[2000, 3, 10]]
77-
)
7874
def test_series_getitem_returns_scalar(
79-
multiindex_year_month_day_dataframe_random_data, indexer
75+
multiindex_year_month_day_dataframe_random_data, indexer_sl
8076
):
8177
s = multiindex_year_month_day_dataframe_random_data["A"]
8278
expected = s.iloc[49]
8379

84-
result = indexer(s)
80+
result = indexer_sl(s)[2000, 3, 10]
8581
assert result == expected
8682

8783

pandas/tests/indexing/multiindex/test_iloc.py

+9-13
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,10 @@ def simple_multiindex_dataframe():
1717
random data by default.
1818
"""
1919

20-
def _simple_multiindex_dataframe(data=None):
21-
if data is None:
22-
data = np.random.randn(3, 3)
23-
return DataFrame(
24-
data, columns=[[2, 2, 4], [6, 8, 10]], index=[[4, 4, 8], [8, 10, 12]]
25-
)
26-
27-
return _simple_multiindex_dataframe
20+
data = np.random.randn(3, 3)
21+
return DataFrame(
22+
data, columns=[[2, 2, 4], [6, 8, 10]], index=[[4, 4, 8], [8, 10, 12]]
23+
)
2824

2925

3026
@pytest.mark.parametrize(
@@ -45,23 +41,23 @@ def _simple_multiindex_dataframe(data=None):
4541
],
4642
)
4743
def test_iloc_returns_series(indexer, expected, simple_multiindex_dataframe):
48-
arr = np.random.randn(3, 3)
49-
df = simple_multiindex_dataframe(arr)
44+
df = simple_multiindex_dataframe
45+
arr = df.values
5046
result = indexer(df)
5147
expected = expected(arr)
5248
tm.assert_series_equal(result, expected)
5349

5450

5551
def test_iloc_returns_dataframe(simple_multiindex_dataframe):
56-
df = simple_multiindex_dataframe()
52+
df = simple_multiindex_dataframe
5753
result = df.iloc[[0, 1]]
5854
expected = df.xs(4, drop_level=False)
5955
tm.assert_frame_equal(result, expected)
6056

6157

6258
def test_iloc_returns_scalar(simple_multiindex_dataframe):
63-
arr = np.random.randn(3, 3)
64-
df = simple_multiindex_dataframe(arr)
59+
df = simple_multiindex_dataframe
60+
arr = df.values
6561
result = df.iloc[2, 2]
6662
expected = arr[2, 2]
6763
assert result == expected

pandas/tests/indexing/multiindex/test_indexing_slow.py

+34-34
Original file line numberDiff line numberDiff line change
@@ -40,49 +40,49 @@
4040
b = df.drop_duplicates(subset=cols[:-1])
4141

4242

43-
@pytest.mark.filterwarnings("ignore::pandas.errors.PerformanceWarning")
44-
@pytest.mark.parametrize("lexsort_depth", list(range(5)))
45-
@pytest.mark.parametrize("key", keys)
46-
@pytest.mark.parametrize("frame", [a, b])
47-
def test_multiindex_get_loc(lexsort_depth, key, frame):
48-
# GH7724, GH2646
43+
def validate(mi, df, key):
44+
# check indexing into a multi-index before & past the lexsort depth
4945

50-
with warnings.catch_warnings(record=True):
46+
mask = np.ones(len(df)).astype("bool")
5147

52-
# test indexing into a multi-index before & past the lexsort depth
48+
# test for all partials of this key
49+
for i, k in enumerate(key):
50+
mask &= df.iloc[:, i] == k
5351

54-
def validate(mi, df, key):
55-
mask = np.ones(len(df)).astype("bool")
52+
if not mask.any():
53+
assert key[: i + 1] not in mi.index
54+
continue
5655

57-
# test for all partials of this key
58-
for i, k in enumerate(key):
59-
mask &= df.iloc[:, i] == k
56+
assert key[: i + 1] in mi.index
57+
right = df[mask].copy()
6058

61-
if not mask.any():
62-
assert key[: i + 1] not in mi.index
63-
continue
59+
if i + 1 != len(key): # partial key
60+
return_value = right.drop(cols[: i + 1], axis=1, inplace=True)
61+
assert return_value is None
62+
return_value = right.set_index(cols[i + 1 : -1], inplace=True)
63+
assert return_value is None
64+
tm.assert_frame_equal(mi.loc[key[: i + 1]], right)
6465

65-
assert key[: i + 1] in mi.index
66-
right = df[mask].copy()
66+
else: # full key
67+
return_value = right.set_index(cols[:-1], inplace=True)
68+
assert return_value is None
69+
if len(right) == 1: # single hit
70+
right = Series(
71+
right["jolia"].values, name=right.index[0], index=["jolia"]
72+
)
73+
tm.assert_series_equal(mi.loc[key[: i + 1]], right)
74+
else: # multi hit
75+
tm.assert_frame_equal(mi.loc[key[: i + 1]], right)
6776

68-
if i + 1 != len(key): # partial key
69-
return_value = right.drop(cols[: i + 1], axis=1, inplace=True)
70-
assert return_value is None
71-
return_value = right.set_index(cols[i + 1 : -1], inplace=True)
72-
assert return_value is None
73-
tm.assert_frame_equal(mi.loc[key[: i + 1]], right)
7477

75-
else: # full key
76-
return_value = right.set_index(cols[:-1], inplace=True)
77-
assert return_value is None
78-
if len(right) == 1: # single hit
79-
right = Series(
80-
right["jolia"].values, name=right.index[0], index=["jolia"]
81-
)
82-
tm.assert_series_equal(mi.loc[key[: i + 1]], right)
83-
else: # multi hit
84-
tm.assert_frame_equal(mi.loc[key[: i + 1]], right)
78+
@pytest.mark.filterwarnings("ignore::pandas.errors.PerformanceWarning")
79+
@pytest.mark.parametrize("lexsort_depth", list(range(5)))
80+
@pytest.mark.parametrize("key", keys)
81+
@pytest.mark.parametrize("frame", [a, b])
82+
def test_multiindex_get_loc(lexsort_depth, key, frame):
83+
# GH7724, GH2646
8584

85+
with warnings.catch_warnings(record=True):
8686
if lexsort_depth == 0:
8787
df = frame.copy()
8888
else:

pandas/tests/indexing/multiindex/test_insert.py

-35
This file was deleted.

pandas/tests/indexing/multiindex/test_ix.py

-67
This file was deleted.

pandas/tests/indexing/multiindex/test_loc.py

+57
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import numpy as np
22
import pytest
33

4+
from pandas.errors import PerformanceWarning
5+
46
import pandas as pd
57
from pandas import (
68
DataFrame,
@@ -29,6 +31,61 @@ def frame_random_data_integer_multi_index():
2931

3032

3133
class TestMultiIndexLoc:
34+
def test_loc_setitem_frame_with_multiindex(self, multiindex_dataframe_random_data):
35+
frame = multiindex_dataframe_random_data
36+
frame.loc[("bar", "two"), "B"] = 5
37+
assert frame.loc[("bar", "two"), "B"] == 5
38+
39+
# with integer labels
40+
df = frame.copy()
41+
df.columns = list(range(3))
42+
df.loc[("bar", "two"), 1] = 7
43+
assert df.loc[("bar", "two"), 1] == 7
44+
45+
def test_loc_getitem_general(self):
46+
47+
# GH#2817
48+
data = {
49+
"amount": {0: 700, 1: 600, 2: 222, 3: 333, 4: 444},
50+
"col": {0: 3.5, 1: 3.5, 2: 4.0, 3: 4.0, 4: 4.0},
51+
"year": {0: 2012, 1: 2011, 2: 2012, 3: 2012, 4: 2012},
52+
}
53+
df = DataFrame(data).set_index(keys=["col", "year"])
54+
key = 4.0, 2012
55+
56+
# emits a PerformanceWarning, ok
57+
with tm.assert_produces_warning(PerformanceWarning):
58+
tm.assert_frame_equal(df.loc[key], df.iloc[2:])
59+
60+
# this is ok
61+
return_value = df.sort_index(inplace=True)
62+
assert return_value is None
63+
res = df.loc[key]
64+
65+
# col has float dtype, result should be Float64Index
66+
index = MultiIndex.from_arrays([[4.0] * 3, [2012] * 3], names=["col", "year"])
67+
expected = DataFrame({"amount": [222, 333, 444]}, index=index)
68+
tm.assert_frame_equal(res, expected)
69+
70+
def test_loc_getitem_multiindex_missing_label_raises(self):
71+
# GH#21593
72+
df = DataFrame(
73+
np.random.randn(3, 3),
74+
columns=[[2, 2, 4], [6, 8, 10]],
75+
index=[[4, 4, 8], [8, 10, 12]],
76+
)
77+
78+
with pytest.raises(KeyError, match=r"^2$"):
79+
df.loc[2]
80+
81+
def test_loc_getitem_list_of_tuples_with_multiindex(
82+
self, multiindex_year_month_day_dataframe_random_data
83+
):
84+
ser = multiindex_year_month_day_dataframe_random_data["A"]
85+
expected = ser.reindex(ser.index[49:51])
86+
result = ser.loc[[(2000, 3, 10), (2000, 3, 13)]]
87+
tm.assert_series_equal(result, expected)
88+
3289
def test_loc_getitem_series(self):
3390
# GH14730
3491
# passing a series as a key with a MultiIndex

0 commit comments

Comments
 (0)