Skip to content

Commit b0d1e2a

Browse files
TomAugspurgerjreback
authored andcommitted
BUG: .rename* not treating Series as mapping
closes pandas-dev#12623 closes pandas-dev#12626 I added com.is_dict_like in pandas-dev#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 ab359c1 commit b0d1e2a

File tree

5 files changed

+55
-22
lines changed

5 files changed

+55
-22
lines changed

doc/source/whatsnew/v0.18.1.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ Bug Fixes
104104

105105
- Bug in ``value_counts`` when ``normalize=True`` and ``dropna=True`` where nulls still contributed to the normalized count (:issue:`12558`)
106106
- Bug in ``Panel.fillna()`` ignoring ``inplace=True`` (:issue:`12633`)
107-
107+
- Bug in ``Series.rename``, ``DataFrame.rename`` and ``DataFrame.rename_axis`` not treating ``Series`` as mappings to relabel (:issue:`12623`).
108108

109109

110110

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
@@ -2334,11 +2333,9 @@ def align(self, other, join='outer', axis=None, level=None, copy=True,
23342333

23352334
@Appender(generic._shared_docs['rename'] % _shared_doc_kwargs)
23362335
def rename(self, index=None, **kwargs):
2337-
is_scalar_or_list = (
2338-
(not com.is_sequence(index) and not callable(index)) or
2339-
(com.is_list_like(index) and not isinstance(index, MutableMapping))
2340-
)
2341-
if is_scalar_or_list:
2336+
non_mapping = lib.isscalar(index) or (com.is_list_like(index) and
2337+
not com.is_dict_like(index))
2338+
if non_mapping:
23422339
return self._set_name(index, inplace=kwargs.get('inplace'))
23432340
return super(Series, self).rename(index=index, **kwargs)
23442341

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)