Skip to content

Commit f72feac

Browse files
fix pivot table aggregation when index is None
1 parent 172e477 commit f72feac

File tree

2 files changed

+35
-4
lines changed

2 files changed

+35
-4
lines changed

pandas/core/reshape/pivot.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -557,7 +557,12 @@ def _all_key(key):
557557
table_pieces.append(piece)
558558
margin_keys.append(all_key)
559559
else:
560-
from pandas import DataFrame
560+
margin = (
561+
data[[cols[0]] + values]
562+
.groupby([cols[0]], observed=observed)
563+
.agg(aggfunc, **kwargs)
564+
.T
565+
)
561566

562567
cat_axis = 0
563568
for key, piece in table.groupby(level=0, observed=observed):
@@ -566,9 +571,7 @@ def _all_key(key):
566571
else:
567572
all_key = margins_name
568573
table_pieces.append(piece)
569-
# GH31016 this is to calculate margin for each group, and assign
570-
# corresponded key as index
571-
transformed_piece = DataFrame(piece.apply(aggfunc, **kwargs)).T
574+
transformed_piece = margin[key].to_frame().T
572575
if isinstance(piece.index, MultiIndex):
573576
# We are adding an empty level
574577
transformed_piece.index = MultiIndex.from_tuples(

pandas/tests/reshape/test_pivot.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2785,3 +2785,31 @@ def test_pivot_empty_with_datetime(self):
27852785
index="category", columns="value", values="timestamp"
27862786
)
27872787
assert df_pivoted.empty
2788+
2789+
def test_pivot_margins_with_none_index(self):
2790+
# GH#58722
2791+
df = DataFrame(
2792+
{
2793+
"x": [1, 1, 2],
2794+
"y": [3, 3, 4],
2795+
"z": [5, 5, 6],
2796+
"w": [7, 8, 9],
2797+
}
2798+
)
2799+
result = df.pivot_table(
2800+
index=None,
2801+
columns=["y", "z"],
2802+
values="w",
2803+
margins=True,
2804+
aggfunc="count",
2805+
)
2806+
expected = DataFrame(
2807+
[[2, 2, 1, 1]],
2808+
index=["w"],
2809+
columns=MultiIndex(
2810+
levels=[[3, 4], [5, 6, "All"]],
2811+
codes=[[0, 0, 1, 1], [0, 2, 1, 2]],
2812+
names=["y", "z"],
2813+
),
2814+
)
2815+
tm.assert_frame_equal(result, expected)

0 commit comments

Comments
 (0)