Skip to content

Commit 085060e

Browse files
committed
BUG/REF: multiindex nested tuples with duplicates (pandas-dev#31358)
1 parent e572098 commit 085060e

File tree

4 files changed

+24
-3
lines changed

4 files changed

+24
-3
lines changed

pandas/core/indexes/multi.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -2643,7 +2643,8 @@ def _maybe_to_slice(loc):
26432643
mask[loc] = True
26442644
return mask
26452645

2646-
if not isinstance(key, tuple):
2646+
if not isinstance(key, (tuple, list)):
2647+
# not including list here breaks some indexing, xref #30892
26472648
loc = self._get_level_indexer(key, level=0)
26482649
return _maybe_to_slice(loc)
26492650

pandas/core/indexing.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -639,7 +639,7 @@ def _get_setitem_indexer(self, key):
639639
if isinstance(ax, ABCMultiIndex) and self.name != "iloc":
640640
try:
641641
return ax.get_loc(key)
642-
except (TypeError, KeyError):
642+
except (TypeError, KeyError, InvalidIndexError):
643643
# TypeError e.g. passed a bool
644644
pass
645645

pandas/tests/indexes/multi/test_indexing.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -396,7 +396,8 @@ def test_get_loc_missing_nan():
396396
idx.get_loc(3)
397397
with pytest.raises(KeyError, match=r"^nan$"):
398398
idx.get_loc(np.nan)
399-
with pytest.raises(KeyError, match=r"^\[nan\]$"):
399+
with pytest.raises(TypeError, match="unhashable type: 'list'"):
400+
# listlike/non-hashable raises TypeError
400401
idx.get_loc([np.nan])
401402

402403

pandas/tests/indexing/multiindex/test_multiindex.py

+19
Original file line numberDiff line numberDiff line change
@@ -92,3 +92,22 @@ def test_contains(self):
9292
assert tx[0] in idx
9393
assert "element_not_exit" not in idx
9494
assert "0 day 09:30:00" in idx
95+
96+
def test_nested_tuples_duplicates(self):
97+
# GH#30892
98+
99+
dti = pd.to_datetime(["20190101", "20190101", "20190102"])
100+
idx = pd.Index(["a", "a", "c"])
101+
mi = pd.MultiIndex.from_arrays([dti, idx], names=["index1", "index2"])
102+
103+
df = pd.DataFrame({"c1": [1, 2, 3], "c2": [np.nan, np.nan, np.nan]}, index=mi)
104+
105+
expected = pd.DataFrame({"c1": df["c1"], "c2": [1.0, 1.0, np.nan]}, index=mi)
106+
107+
df2 = df.copy(deep=True)
108+
df2.loc[(dti[0], "a"), "c2"] = 1.0
109+
tm.assert_frame_equal(df2, expected)
110+
111+
df3 = df.copy(deep=True)
112+
df3.loc[[(dti[0], "a")], "c2"] = 1.0
113+
tm.assert_frame_equal(df3, expected)

0 commit comments

Comments
 (0)