Skip to content

Commit cea27b4

Browse files
authored
BUG: DataFrame.pivot(index=None) with MultiIndex (#45141)
1 parent 8532faa commit cea27b4

File tree

3 files changed

+30
-1
lines changed

3 files changed

+30
-1
lines changed

doc/source/whatsnew/v1.4.0.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -968,6 +968,7 @@ Reshaping
968968
- Bug in :meth:`Series.unstack` with object doing unwanted type inference on resulting columns (:issue:`44595`)
969969
- Bug in :class:`MultiIndex` failing join operations with overlapping ``IntervalIndex`` levels (:issue:`44096`)
970970
- Bug in :meth:`DataFrame.replace` and :meth:`Series.replace` results is different ``dtype`` based on ``regex`` parameter (:issue:`44864`)
971+
- Bug in :meth:`DataFrame.pivot` with ``index=None`` when the :class:`DataFrame` index was a :class:`MultiIndex` (:issue:`23955`)
971972

972973
Sparse
973974
^^^^^^

pandas/core/reshape/pivot.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -495,7 +495,13 @@ def pivot(
495495
)
496496
else:
497497
if index is None:
498-
index_list = [Series(data.index, name=data.index.name)]
498+
if isinstance(data.index, MultiIndex):
499+
# GH 23955
500+
index_list = [
501+
data.index.get_level_values(i) for i in range(data.index.nlevels)
502+
]
503+
else:
504+
index_list = [Series(data.index, name=data.index.name)]
499505
else:
500506
index_list = [data[idx] for idx in com.convert_to_list_like(index)]
501507

pandas/tests/reshape/test_pivot_multilevel.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,3 +228,25 @@ def test_pivot_multiindexed_rows_and_cols(using_array_manager):
228228
expected = expected.astype("float64")
229229

230230
tm.assert_frame_equal(res, expected)
231+
232+
233+
def test_pivot_df_multiindex_index_none():
234+
# GH 23955
235+
df = pd.DataFrame(
236+
[
237+
["A", "A1", "label1", 1],
238+
["A", "A2", "label2", 2],
239+
["B", "A1", "label1", 3],
240+
["B", "A2", "label2", 4],
241+
],
242+
columns=["index_1", "index_2", "label", "value"],
243+
)
244+
df = df.set_index(["index_1", "index_2"])
245+
246+
result = df.pivot(index=None, columns="label", values="value")
247+
expected = pd.DataFrame(
248+
[[1.0, np.nan], [np.nan, 2.0], [3.0, np.nan], [np.nan, 4.0]],
249+
index=df.index,
250+
columns=Index(["label1", "label2"], name="label"),
251+
)
252+
tm.assert_frame_equal(result, expected)

0 commit comments

Comments
 (0)