Skip to content

Commit 528148f

Browse files
authored
DataFrame.truncate drops MultiIndex names (#34589)
1 parent 5a4fe4f commit 528148f

File tree

5 files changed

+42
-3
lines changed

5 files changed

+42
-3
lines changed

doc/source/whatsnew/v1.1.0.rst

+1
Original file line numberDiff line numberDiff line change
@@ -956,6 +956,7 @@ MultiIndex
956956
df.loc[(['b', 'a'], [2, 1]), :]
957957
958958
- Bug in :meth:`MultiIndex.intersection` was not guaranteed to preserve order when ``sort=False``. (:issue:`31325`)
959+
- Bug in :meth:`DataFrame.truncate` was dropping :class:`MultiIndex` names. (:issue:`34564`)
959960

960961
.. ipython:: python
961962

pandas/core/indexes/multi.py

+6-1
Original file line numberDiff line numberDiff line change
@@ -3193,7 +3193,12 @@ def truncate(self, before=None, after=None):
31933193
new_codes = [level_codes[left:right] for level_codes in self.codes]
31943194
new_codes[0] = new_codes[0] - i
31953195

3196-
return MultiIndex(levels=new_levels, codes=new_codes, verify_integrity=False)
3196+
return MultiIndex(
3197+
levels=new_levels,
3198+
codes=new_codes,
3199+
names=self._names,
3200+
verify_integrity=False,
3201+
)
31973202

31983203
def equals(self, other) -> bool:
31993204
"""

pandas/tests/frame/methods/test_truncate.py

+13
Original file line numberDiff line numberDiff line change
@@ -104,3 +104,16 @@ def test_truncate_decreasing_index(self, before, after, indices, klass):
104104
result = values.truncate(before=before, after=after)
105105
expected = values.loc[indices]
106106
tm.assert_frame_equal(result, expected)
107+
108+
def test_truncate_multiindex(self):
109+
# GH 34564
110+
mi = pd.MultiIndex.from_product([[1, 2, 3, 4], ["A", "B"]], names=["L1", "L2"])
111+
s1 = pd.DataFrame(range(mi.shape[0]), index=mi, columns=["col"])
112+
result = s1.truncate(before=2, after=3)
113+
114+
df = pd.DataFrame.from_dict(
115+
{"L1": [2, 2, 3, 3], "L2": ["A", "B", "A", "B"], "col": [2, 3, 4, 5]}
116+
)
117+
expected = df.set_index(["L1", "L2"])
118+
119+
tm.assert_frame_equal(result, expected)

pandas/tests/indexes/multi/test_analytics.py

+8-2
Original file line numberDiff line numberDiff line change
@@ -30,27 +30,33 @@ def test_groupby(idx):
3030
tm.assert_dict_equal(groups, exp)
3131

3232

33-
def test_truncate():
33+
def test_truncate_multiindex():
34+
# GH 34564 for MultiIndex level names check
3435
major_axis = Index(list(range(4)))
3536
minor_axis = Index(list(range(2)))
3637

3738
major_codes = np.array([0, 0, 1, 2, 3, 3])
3839
minor_codes = np.array([0, 1, 0, 1, 0, 1])
3940

4041
index = MultiIndex(
41-
levels=[major_axis, minor_axis], codes=[major_codes, minor_codes]
42+
levels=[major_axis, minor_axis],
43+
codes=[major_codes, minor_codes],
44+
names=["L1", "L2"],
4245
)
4346

4447
result = index.truncate(before=1)
4548
assert "foo" not in result.levels[0]
4649
assert 1 in result.levels[0]
50+
assert index.names == result.names
4751

4852
result = index.truncate(after=1)
4953
assert 2 not in result.levels[0]
5054
assert 1 in result.levels[0]
55+
assert index.names == result.names
5156

5257
result = index.truncate(before=1, after=2)
5358
assert len(result.levels[0]) == 2
59+
assert index.names == result.names
5460

5561
msg = "after < before"
5662
with pytest.raises(ValueError, match=msg):

pandas/tests/series/methods/test_truncate.py

+14
Original file line numberDiff line numberDiff line change
@@ -126,3 +126,17 @@ def test_truncate_periodindex(self):
126126

127127
expected_idx2 = pd.PeriodIndex([pd.Period("2017-09-02")])
128128
tm.assert_series_equal(result2, pd.Series([2], index=expected_idx2))
129+
130+
def test_truncate_multiindex(self):
131+
# GH 34564
132+
mi = pd.MultiIndex.from_product([[1, 2, 3, 4], ["A", "B"]], names=["L1", "L2"])
133+
s1 = pd.Series(range(mi.shape[0]), index=mi, name="col")
134+
result = s1.truncate(before=2, after=3)
135+
136+
df = pd.DataFrame.from_dict(
137+
{"L1": [2, 2, 3, 3], "L2": ["A", "B", "A", "B"], "col": [2, 3, 4, 5]}
138+
)
139+
df.set_index(["L1", "L2"], inplace=True)
140+
expected = df.col
141+
142+
tm.assert_series_equal(result, expected)

0 commit comments

Comments
 (0)