@@ -12266,6 +12266,56 @@ def test_stack_datetime_column_multiIndex(self):
12266
12266
expected = DataFrame([1, 2, 3, 4], index=eidx, columns=ecols)
12267
12267
assert_frame_equal(result, expected)
12268
12268
12269
+ def test_stack_partial_multiIndex(self):
12270
+ # GH 8844
12271
+ def _test_stack_with_multiindex(multiindex):
12272
+ df = DataFrame(np.arange(3 * len(multiindex)).reshape(3, len(multiindex)),
12273
+ columns=multiindex)
12274
+ for level in (-1, 0, 1, [0, 1], [1, 0]):
12275
+ result = df.stack(level=level, dropna=False)
12276
+
12277
+ if isinstance(level, int):
12278
+ # Stacking a single level should not make any all-NaN rows,
12279
+ # so df.stack(level=level, dropna=False) should be the same
12280
+ # as df.stack(level=level, dropna=True).
12281
+ expected = df.stack(level=level, dropna=True)
12282
+ if isinstance(expected, Series):
12283
+ assert_series_equal(result, expected)
12284
+ else:
12285
+ assert_frame_equal(result, expected)
12286
+
12287
+ df.columns = MultiIndex.from_tuples(df.columns.get_values(),
12288
+ names=df.columns.names)
12289
+ expected = df.stack(level=level, dropna=False)
12290
+ if isinstance(expected, Series):
12291
+ assert_series_equal(result, expected)
12292
+ else:
12293
+ assert_frame_equal(result, expected)
12294
+
12295
+ full_multiindex = MultiIndex.from_tuples([('B', 'x'), ('B', 'z'),
12296
+ ('A', 'y'),
12297
+ ('C', 'x'), ('C', 'u')],
12298
+ names=['Upper', 'Lower'])
12299
+ for multiindex_columns in ([0, 1, 2, 3, 4],
12300
+ [0, 1, 2, 3], [0, 1, 2, 4],
12301
+ [0, 1, 2], [1, 2, 3], [2, 3, 4],
12302
+ [0, 1], [0, 2], [0, 3],
12303
+ [0], [2], [4]):
12304
+ _test_stack_with_multiindex(full_multiindex[multiindex_columns])
12305
+ if len(multiindex_columns) > 1:
12306
+ multiindex_columns.reverse()
12307
+ _test_stack_with_multiindex(full_multiindex[multiindex_columns])
12308
+
12309
+ df = DataFrame(np.arange(6).reshape(2, 3), columns=full_multiindex[[0, 1, 3]])
12310
+ result = df.stack(dropna=False)
12311
+ expected = DataFrame([[0, 2], [1, nan], [3, 5], [4, nan]],
12312
+ index=MultiIndex(levels=[[0, 1], ['u', 'x', 'y', 'z']],
12313
+ labels=[[0, 0, 1, 1], [1, 3, 1, 3]],
12314
+ names=[None, 'Lower']),
12315
+ columns=Index(['B', 'C'], name='Upper'),
12316
+ dtype=df.dtypes[0])
12317
+ assert_frame_equal(result, expected)
12318
+
12269
12319
def test_repr_with_mi_nat(self):
12270
12320
df = DataFrame({'X': [1, 2]},
12271
12321
index=[[pd.NaT, pd.Timestamp('20130101')], ['a', 'b']])
0 commit comments