Skip to content

Commit 1ee90a5

Browse files
committed
Merge pull request #7802 from sinhrks/reset_index_bug
BUG: reset_index with MultiIndex contains PeriodIndex raises ValueError
2 parents 82c92b5 + 4e1bbb4 commit 1ee90a5

File tree

3 files changed

+36
-7
lines changed

3 files changed

+36
-7
lines changed

doc/source/v0.15.0.txt

+2
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,8 @@ Bug Fixes
194194

195195

196196

197+
- Bug in ``DataFrame.reset_index`` which has ``MultiIndex`` contains ``PeriodIndex`` or ``DatetimeIndex`` with tz raises ``ValueError`` (:issue:`7746`, :issue:`7793`)
198+
197199

198200

199201

pandas/core/frame.py

+7-7
Original file line numberDiff line numberDiff line change
@@ -2452,13 +2452,13 @@ def _maybe_casted_values(index, labels=None):
24522452
if values.dtype == np.object_:
24532453
values = lib.maybe_convert_objects(values)
24542454

2455-
# if we have the labels, extract the values with a mask
2456-
if labels is not None:
2457-
mask = labels == -1
2458-
values = values.take(labels)
2459-
if mask.any():
2460-
values, changed = com._maybe_upcast_putmask(values,
2461-
mask, np.nan)
2455+
# if we have the labels, extract the values with a mask
2456+
if labels is not None:
2457+
mask = labels == -1
2458+
values = values.take(labels)
2459+
if mask.any():
2460+
values, changed = com._maybe_upcast_putmask(values,
2461+
mask, np.nan)
24622462
return values
24632463

24642464
new_index = np.arange(len(new_obj))

pandas/tests/test_multilevel.py

+27
Original file line numberDiff line numberDiff line change
@@ -2118,6 +2118,33 @@ def test_reset_index_datetime(self):
21182118
expected['idx3'] = expected['idx3'].apply(lambda d: pd.Timestamp(d, tz='Europe/Paris'))
21192119
assert_frame_equal(df.reset_index(), expected)
21202120

2121+
# GH 7793
2122+
idx = pd.MultiIndex.from_product([['a','b'], pd.date_range('20130101', periods=3, tz=tz)])
2123+
df = pd.DataFrame(np.arange(6).reshape(6,1), columns=['a'], index=idx)
2124+
2125+
expected = pd.DataFrame({'level_0': 'a a a b b b'.split(),
2126+
'level_1': [datetime.datetime(2013, 1, 1),
2127+
datetime.datetime(2013, 1, 2),
2128+
datetime.datetime(2013, 1, 3)] * 2,
2129+
'a': np.arange(6, dtype='int64')},
2130+
columns=['level_0', 'level_1', 'a'])
2131+
expected['level_1'] = expected['level_1'].apply(lambda d: pd.Timestamp(d, offset='D', tz=tz))
2132+
assert_frame_equal(df.reset_index(), expected)
2133+
2134+
def test_reset_index_period(self):
2135+
# GH 7746
2136+
idx = pd.MultiIndex.from_product([pd.period_range('20130101', periods=3, freq='M'),
2137+
['a','b','c']], names=['month', 'feature'])
2138+
2139+
df = pd.DataFrame(np.arange(9).reshape(-1,1), index=idx, columns=['a'])
2140+
expected = pd.DataFrame({'month': [pd.Period('2013-01', freq='M')] * 3 +
2141+
[pd.Period('2013-02', freq='M')] * 3 +
2142+
[pd.Period('2013-03', freq='M')] * 3,
2143+
'feature': ['a', 'b', 'c'] * 3,
2144+
'a': np.arange(9, dtype='int64')},
2145+
columns=['month', 'feature', 'a'])
2146+
assert_frame_equal(df.reset_index(), expected)
2147+
21212148
def test_set_index_period(self):
21222149
# GH 6631
21232150
df = DataFrame(np.random.random(6))

0 commit comments

Comments
 (0)