Skip to content

Commit ecb0527

Browse files
meeseeksmachineTomAugspurger
authored andcommitted
Backport PR #31133: BUG: Break reference from grouping level to MI (#31164)
Co-authored-by: Tom Augspurger <[email protected]>
1 parent 0b9ad35 commit ecb0527

File tree

2 files changed

+21
-0
lines changed

2 files changed

+21
-0
lines changed

pandas/core/indexes/multi.py

+4
Original file line numberDiff line numberDiff line change
@@ -1256,6 +1256,10 @@ def _get_grouper_for_level(self, mapper, level):
12561256
if len(uniques) < len(level_index):
12571257
# Remove unobserved levels from level_index
12581258
level_index = level_index.take(uniques)
1259+
else:
1260+
# break references back to us so that setting the name
1261+
# on the output of a groupby doesn't reflect back here.
1262+
level_index = level_index.copy()
12591263

12601264
if len(level_index):
12611265
grouper = level_index.take(codes)

pandas/tests/groupby/test_apply.py

+17
Original file line numberDiff line numberDiff line change
@@ -752,3 +752,20 @@ def most_common_values(df):
752752
["17661101"], index=pd.DatetimeIndex(["2015-02-24"], name="day"), name="userId"
753753
)
754754
tm.assert_series_equal(result, expected)
755+
756+
757+
@pytest.mark.parametrize("category", [False, True])
758+
def test_apply_multi_level_name(category):
759+
# https://github.com/pandas-dev/pandas/issues/31068
760+
b = [1, 2] * 5
761+
if category:
762+
b = pd.Categorical(b, categories=[1, 2, 3])
763+
df = pd.DataFrame(
764+
{"A": np.arange(10), "B": b, "C": list(range(10)), "D": list(range(10))}
765+
).set_index(["A", "B"])
766+
result = df.groupby("B").apply(lambda x: x.sum())
767+
expected = pd.DataFrame(
768+
{"C": [20, 25], "D": [20, 25]}, index=pd.Index([1, 2], name="B")
769+
)
770+
tm.assert_frame_equal(result, expected)
771+
assert df.index.names == ["A", "B"]

0 commit comments

Comments
 (0)