diff --git a/doc/source/v0.15.0.txt b/doc/source/v0.15.0.txt index ca24eb3f910ed..3ce193763779b 100644 --- a/doc/source/v0.15.0.txt +++ b/doc/source/v0.15.0.txt @@ -193,6 +193,8 @@ Bug Fixes +- Bug in ``DataFrame.reset_index`` which has ``MultiIndex`` contains ``PeriodIndex`` or ``DatetimeIndex`` with tz raises ``ValueError`` (:issue:`7746`, :issue:`7793`) + diff --git a/pandas/core/frame.py b/pandas/core/frame.py index 17bef8dd28cf4..4f558dda756dd 100644 --- a/pandas/core/frame.py +++ b/pandas/core/frame.py @@ -2452,13 +2452,13 @@ def _maybe_casted_values(index, labels=None): if values.dtype == np.object_: values = lib.maybe_convert_objects(values) - # if we have the labels, extract the values with a mask - if labels is not None: - mask = labels == -1 - values = values.take(labels) - if mask.any(): - values, changed = com._maybe_upcast_putmask(values, - mask, np.nan) + # if we have the labels, extract the values with a mask + if labels is not None: + mask = labels == -1 + values = values.take(labels) + if mask.any(): + values, changed = com._maybe_upcast_putmask(values, + mask, np.nan) return values new_index = np.arange(len(new_obj)) diff --git a/pandas/tests/test_multilevel.py b/pandas/tests/test_multilevel.py index c0ca5451ef1d2..d8e17c4d1d290 100644 --- a/pandas/tests/test_multilevel.py +++ b/pandas/tests/test_multilevel.py @@ -2118,6 +2118,33 @@ def test_reset_index_datetime(self): expected['idx3'] = expected['idx3'].apply(lambda d: pd.Timestamp(d, tz='Europe/Paris')) assert_frame_equal(df.reset_index(), expected) + # GH 7793 + idx = pd.MultiIndex.from_product([['a','b'], pd.date_range('20130101', periods=3, tz=tz)]) + df = pd.DataFrame(np.arange(6).reshape(6,1), columns=['a'], index=idx) + + expected = pd.DataFrame({'level_0': 'a a a b b b'.split(), + 'level_1': [datetime.datetime(2013, 1, 1), + datetime.datetime(2013, 1, 2), + datetime.datetime(2013, 1, 3)] * 2, + 'a': np.arange(6, dtype='int64')}, + columns=['level_0', 'level_1', 'a']) + expected['level_1'] = expected['level_1'].apply(lambda d: pd.Timestamp(d, offset='D', tz=tz)) + assert_frame_equal(df.reset_index(), expected) + + def test_reset_index_period(self): + # GH 7746 + idx = pd.MultiIndex.from_product([pd.period_range('20130101', periods=3, freq='M'), + ['a','b','c']], names=['month', 'feature']) + + df = pd.DataFrame(np.arange(9).reshape(-1,1), index=idx, columns=['a']) + expected = pd.DataFrame({'month': [pd.Period('2013-01', freq='M')] * 3 + + [pd.Period('2013-02', freq='M')] * 3 + + [pd.Period('2013-03', freq='M')] * 3, + 'feature': ['a', 'b', 'c'] * 3, + 'a': np.arange(9, dtype='int64')}, + columns=['month', 'feature', 'a']) + assert_frame_equal(df.reset_index(), expected) + def test_set_index_period(self): # GH 6631 df = DataFrame(np.random.random(6))