Skip to content

Commit 10ea582

Browse files
committed
BUG: .rename* not treating Series as mapping
Closes #12623 I added com.is_dict_like in #11980 and failed to use it for the `rename` method. Using that now and did some refactoring while I was in there. Added more tests for rename.
1 parent 80ef4e0 commit 10ea582

File tree

5 files changed

+59
-21
lines changed

5 files changed

+59
-21
lines changed

doc/source/whatsnew/v0.18.1.txt

+5
Original file line numberDiff line numberDiff line change
@@ -89,3 +89,8 @@ Bug Fixes
8989
~~~~~~~~~
9090

9191
- Bug in ``value_counts`` when ``normalize=True`` and ``dropna=True`` where nulls still contributed to the normalized count (:issue:`12558`)
92+
93+
94+
- Bug in ``Series.rename``, ``DataFrame.rename`` and ``DataFrame.rename_axis`` not treating ``Series`` as mappings to relabel (:issue:`12623`).
95+
96+

pandas/core/generic.py

+3-6
Original file line numberDiff line numberDiff line change
@@ -700,12 +700,9 @@ def rename_axis(self, mapper, axis=0, copy=True, inplace=False):
700700
1 2 5
701701
2 3 6
702702
"""
703-
is_scalar_or_list = (
704-
(not com.is_sequence(mapper) and not callable(mapper)) or
705-
(com.is_list_like(mapper) and not com.is_dict_like(mapper))
706-
)
707-
708-
if is_scalar_or_list:
703+
non_mapper = lib.isscalar(mapper) or (com.is_list_like(mapper) and not
704+
com.is_dict_like(mapper))
705+
if non_mapper:
709706
return self._set_axis_name(mapper, axis=axis)
710707
else:
711708
axis = self._get_axis_name(axis)

pandas/core/series.py

+3-6
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88

99
import types
1010
import warnings
11-
from collections import MutableMapping
1211

1312
from numpy import nan, ndarray
1413
import numpy as np
@@ -2331,11 +2330,9 @@ def align(self, other, join='outer', axis=None, level=None, copy=True,
23312330

23322331
@Appender(generic._shared_docs['rename'] % _shared_doc_kwargs)
23332332
def rename(self, index=None, **kwargs):
2334-
is_scalar_or_list = (
2335-
(not com.is_sequence(index) and not callable(index)) or
2336-
(com.is_list_like(index) and not isinstance(index, MutableMapping))
2337-
)
2338-
if is_scalar_or_list:
2333+
non_mapping = lib.isscalar(index) or (com.is_list_like(index) and
2334+
not com.is_dict_like(index))
2335+
if non_mapping:
23392336
return self._set_name(index, inplace=kwargs.get('inplace'))
23402337
return super(Series, self).rename(index=index, **kwargs)
23412338

pandas/tests/series/test_alter_axes.py

+7
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,13 @@ def test_rename(self):
5555
renamed = renamer.rename({})
5656
self.assertEqual(renamed.index.name, renamer.index.name)
5757

58+
def test_rename_by_series(self):
59+
s = Series(range(5), name='foo')
60+
renamer = Series({1: 10, 2: 20})
61+
result = s.rename(renamer)
62+
expected = Series(range(5), index=[0, 10, 20, 3, 4], name='foo')
63+
tm.assert_series_equal(result, expected)
64+
5865
def test_rename_set_name(self):
5966
s = Series(range(4), index=list('abcd'))
6067
for name in ['foo', ['foo'], ('foo',)]:

pandas/tests/test_generic.py

+41-9
Original file line numberDiff line numberDiff line change
@@ -88,21 +88,53 @@ def _compare(self, result, expected):
8888
def test_rename(self):
8989

9090
# single axis
91+
idx = list('ABCD')
92+
# relabeling values passed into self.rename
93+
args = [
94+
str.lower,
95+
{x: x.lower() for x in idx},
96+
Series({x: x.lower() for x in idx}),
97+
]
98+
9199
for axis in self._axes():
92-
kwargs = {axis: list('ABCD')}
100+
kwargs = {axis: idx}
93101
obj = self._construct(4, **kwargs)
94102

95-
# no values passed
96-
# self.assertRaises(Exception, o.rename(str.lower))
97-
98-
# rename a single axis
99-
result = obj.rename(**{axis: str.lower})
100-
expected = obj.copy()
101-
setattr(expected, axis, list('abcd'))
102-
self._compare(result, expected)
103+
for arg in args:
104+
# rename a single axis
105+
result = obj.rename(**{axis: arg})
106+
expected = obj.copy()
107+
setattr(expected, axis, list('abcd'))
108+
self._compare(result, expected)
103109

104110
# multiple axes at once
105111

112+
def test_rename_axis(self):
113+
idx = list('ABCD')
114+
# relabeling values passed into self.rename
115+
args = [
116+
str.lower,
117+
{x: x.lower() for x in idx},
118+
Series({x: x.lower() for x in idx}),
119+
]
120+
121+
for axis in self._axes():
122+
kwargs = {axis: idx}
123+
obj = self._construct(4, **kwargs)
124+
125+
for arg in args:
126+
# rename a single axis
127+
result = obj.rename_axis(arg, axis=axis)
128+
expected = obj.copy()
129+
setattr(expected, axis, list('abcd'))
130+
self._compare(result, expected)
131+
# scalar values
132+
for arg in ['foo', None]:
133+
result = obj.rename_axis(arg, axis=axis)
134+
expected = obj.copy()
135+
getattr(expected, axis).name = arg
136+
self._compare(result, expected)
137+
106138
def test_get_numeric_data(self):
107139

108140
n = 4

0 commit comments

Comments
 (0)