Skip to content

Commit c78d5c5

Browse files
committed
BUG: DataFrame.reset_index failure if both drop and level are present #1957
1 parent 8c0e206 commit c78d5c5

File tree

3 files changed

+23
-16
lines changed

3 files changed

+23
-16
lines changed

pandas/core/frame.py

+15-15
Original file line numberDiff line numberDiff line change
@@ -2489,17 +2489,18 @@ def _maybe_cast(values):
24892489
return values
24902490

24912491
new_index = np.arange(len(new_obj))
2492-
if not drop:
2493-
if isinstance(self.index, MultiIndex):
2492+
if isinstance(self.index, MultiIndex):
2493+
if level is not None:
2494+
if not isinstance(level, (tuple, list)):
2495+
level = [level]
2496+
level = [self.index._get_level_number(lev) for lev in level]
2497+
if len(level) < len(self.index.levels):
2498+
new_index = self.index.droplevel(level)
2499+
2500+
if not drop:
24942501
names = self.index.names
24952502
zipped = zip(self.index.levels, self.index.labels)
24962503

2497-
if level is not None:
2498-
if not isinstance(level, (tuple, list)):
2499-
level = [level]
2500-
2501-
level = [self.index._get_level_number(lev) for lev in level]
2502-
25032504
for i, (lev, lab) in reversed(list(enumerate(zipped))):
25042505
col_name = names[i]
25052506
if col_name is None:
@@ -2510,13 +2511,12 @@ def _maybe_cast(values):
25102511
if level is None or i in level:
25112512
new_obj.insert(0, col_name, level_values.take(lab))
25122513

2513-
if level is not None and len(level) < len(self.index.levels):
2514-
new_index = self.index.droplevel(level)
2515-
else:
2516-
name = self.index.name
2517-
if name is None or name == 'index':
2518-
name = 'index' if 'index' not in self else 'level_0'
2519-
new_obj.insert(0, name, _maybe_cast(self.index.values))
2514+
elif not drop:
2515+
name = self.index.name
2516+
if name is None or name == 'index':
2517+
name = 'index' if 'index' not in self else 'level_0'
2518+
new_obj.insert(0, name, _maybe_cast(self.index.values))
2519+
25202520
new_obj.index = new_index
25212521
return new_obj
25222522

pandas/core/series.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -788,7 +788,7 @@ def set_value(self, label, value):
788788
new_values = np.concatenate([self.values, [value]])
789789
return Series(new_values, index=new_index, name=self.name)
790790

791-
def reset_index(self, drop=False, name=None, inplace=False):
791+
def reset_index(self, level=None, drop=False, name=None, inplace=False):
792792
"""
793793
Analogous to the DataFrame.reset_index function, see docstring there.
794794

pandas/tests/test_frame.py

+7
Original file line numberDiff line numberDiff line change
@@ -6605,6 +6605,13 @@ def test_reset_index(self):
66056605
df.reset_index(inplace=True)
66066606
assert_frame_equal(df, resetted)
66076607

6608+
frame = self.frame.reset_index().set_index(['index', 'A', 'B'])
6609+
rs = frame.reset_index('A', drop=True)
6610+
xp = self.frame.copy()
6611+
del xp['A']
6612+
xp = xp.set_index(['B'], append=True)
6613+
assert_frame_equal(rs, xp)
6614+
66086615
def test_reset_index_right_dtype(self):
66096616
time = np.arange(0.0, 10, np.sqrt(2)/2)
66106617
s1 = Series((9.81 * time ** 2) /2,

0 commit comments

Comments
 (0)