Skip to content

Commit e1e14a4

Browse files
committed
Merge pull request #3175 from waitingkuo/fix-rename
BUG: Fix the rename function for Series and DataFrame, #3165
2 parents fe438e9 + cc9ad4e commit e1e14a4

File tree

4 files changed

+28
-3
lines changed

4 files changed

+28
-3
lines changed

pandas/core/internals.py

+8-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import numpy as np
66

77
from pandas.core.common import _possibly_downcast_to_dtype, isnull
8-
from pandas.core.index import Index, _ensure_index, _handle_legacy_indexes
8+
from pandas.core.index import Index, MultiIndex, _ensure_index, _handle_legacy_indexes
99
from pandas.core.indexing import _check_slice_bounds, _maybe_convert_indices
1010
import pandas.core.common as com
1111
import pandas.lib as lib
@@ -1646,7 +1646,13 @@ def _is_indexed_like(self, other):
16461646
return True
16471647

16481648
def rename_axis(self, mapper, axis=1):
1649-
new_axis = Index([mapper(x) for x in self.axes[axis]])
1649+
1650+
index = self.axes[axis]
1651+
if isinstance(index, MultiIndex):
1652+
new_axis = MultiIndex.from_tuples([tuple(mapper(y) for y in x) for x in index], names=index.names)
1653+
else:
1654+
new_axis = Index([mapper(x) for x in index], name=index.name)
1655+
16501656
if not new_axis.is_unique:
16511657
raise AssertionError('New axis must be unique to rename')
16521658

pandas/core/series.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -3108,7 +3108,7 @@ def rename(self, mapper, inplace=False):
31083108
"""
31093109
mapper_f = _get_rename_function(mapper)
31103110
result = self if inplace else self.copy()
3111-
result.index = [mapper_f(x) for x in self.index]
3111+
result.index = Index([mapper_f(x) for x in self.index], name=self.index.name)
31123112

31133113
if inplace:
31143114
import warnings

pandas/tests/test_frame.py

+14
Original file line numberDiff line numberDiff line change
@@ -6758,6 +6758,20 @@ def test_rename(self):
67586758
renamed = self.frame.T.rename(index={'C': 'foo', 'D': 'bar'})
67596759
self.assert_(np.array_equal(renamed.index, ['A', 'B', 'foo', 'bar']))
67606760

6761+
# index with name
6762+
index = Index(['foo', 'bar'], name='name')
6763+
renamer = DataFrame(data, index=index)
6764+
renamed = renamer.rename(index={'foo': 'bar', 'bar': 'foo'})
6765+
self.assert_(np.array_equal(renamed.index, ['bar', 'foo']))
6766+
self.assertEquals(renamed.index.name, renamer.index.name)
6767+
6768+
# MultiIndex
6769+
index = MultiIndex.from_tuples([('foo1', 'bar1'), ('foo2', 'bar2')], names=['foo', 'bar'])
6770+
renamer = DataFrame(data, index=index)
6771+
renamed = renamer.rename(index={'foo1': 'foo3', 'bar2': 'bar3'})
6772+
self.assert_(np.array_equal(renamed.index, MultiIndex.from_tuples([('foo3', 'bar1'), ('foo2', 'bar3')])))
6773+
self.assertEquals(renamed.index.names, renamer.index.names)
6774+
67616775
def test_rename_nocopy(self):
67626776
renamed = self.frame.rename(columns={'C': 'foo'}, copy=False)
67636777
renamed['foo'] = 1.

pandas/tests/test_series.py

+5
Original file line numberDiff line numberDiff line change
@@ -3576,6 +3576,11 @@ def test_rename(self):
35763576
renamed = s.rename({'b': 'foo', 'd': 'bar'})
35773577
self.assert_(np.array_equal(renamed.index, ['a', 'foo', 'c', 'bar']))
35783578

3579+
# index with name
3580+
renamer = Series(np.arange(4), index=Index(['a', 'b', 'c', 'd'], name='name'))
3581+
renamed = renamer.rename({})
3582+
self.assertEqual(renamed.index.name, renamer.index.name)
3583+
35793584
def test_rename_inplace(self):
35803585
renamer = lambda x: x.strftime('%Y%m%d')
35813586
expected = renamer(self.ts.index[0])

0 commit comments

Comments
 (0)