Skip to content

Commit f6cfaab

Browse files
ExpHPjreback
authored andcommitted
BUG: Support empty dict-likes in replace()
closes #15289 Author: Michael Lamparski <[email protected]> Closes #15294 from ExpHP/bugfix-15289 and squashes the following commits: f349e0a [Michael Lamparski] BUG: Support empty dict-likes in replace()
1 parent 8452080 commit f6cfaab

File tree

4 files changed

+20
-3
lines changed

4 files changed

+20
-3
lines changed

doc/source/whatsnew/v0.20.0.txt

+1
Original file line numberDiff line numberDiff line change
@@ -512,3 +512,4 @@ Bug Fixes
512512

513513

514514
- Bug in ``DataFrame.boxplot`` where ``fontsize`` was not applied to the tick labels on both axes (:issue:`15108`)
515+
- Bug in ``Series.replace`` and ``DataFrame.replace`` which failed on empty replacement dicts (:issue:`15289`)

pandas/core/generic.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@
4848
from pandas.tseries.frequencies import to_offset
4949
from pandas import compat
5050
from pandas.compat.numpy import function as nv
51-
from pandas.compat import (map, zip, lrange, string_types,
51+
from pandas.compat import (map, zip, lzip, lrange, string_types,
5252
isidentifier, set_function_name)
5353
import pandas.core.nanops as nanops
5454
from pandas.util.decorators import Appender, Substitution, deprecate_kwarg
@@ -3509,7 +3509,7 @@ def replace(self, to_replace=None, value=None, inplace=False, limit=None,
35093509
regex = True
35103510

35113511
items = list(compat.iteritems(to_replace))
3512-
keys, values = zip(*items)
3512+
keys, values = lzip(*items) or ([], [])
35133513

35143514
are_mappings = [is_dict_like(v) for v in values]
35153515

@@ -3523,7 +3523,7 @@ def replace(self, to_replace=None, value=None, inplace=False, limit=None,
35233523
value_dict = {}
35243524

35253525
for k, v in items:
3526-
keys, values = zip(*v.items())
3526+
keys, values = lzip(*v.items()) or ([], [])
35273527
if set(keys) & set(values):
35283528
raise ValueError("Replacement not allowed with "
35293529
"overlapping keys and values")

pandas/tests/frame/test_replace.py

+10
Original file line numberDiff line numberDiff line change
@@ -1055,3 +1055,13 @@ def test_replace_datetimetz(self):
10551055
Timestamp('20130103', tz='US/Eastern')],
10561056
'B': [0, np.nan, 2]})
10571057
assert_frame_equal(result, expected)
1058+
1059+
def test_replace_with_empty_dictlike(self):
1060+
# GH 15289
1061+
mix = {'a': lrange(4), 'b': list('ab..'), 'c': ['a', 'b', nan, 'd']}
1062+
df = DataFrame(mix)
1063+
assert_frame_equal(df, df.replace({}))
1064+
assert_frame_equal(df, df.replace(Series([])))
1065+
1066+
assert_frame_equal(df, df.replace({'b': {}}))
1067+
assert_frame_equal(df, df.replace(Series({'b': {}})))

pandas/tests/series/test_replace.py

+6
Original file line numberDiff line numberDiff line change
@@ -223,3 +223,9 @@ def test_replace2(self):
223223
self.assertTrue((ser[:5] == -1).all())
224224
self.assertTrue((ser[6:10] == -1).all())
225225
self.assertTrue((ser[20:30] == -1).all())
226+
227+
def test_replace_with_empty_dictlike(self):
228+
# GH 15289
229+
s = pd.Series(list('abcd'))
230+
tm.assert_series_equal(s, s.replace(dict()))
231+
tm.assert_series_equal(s, s.replace(pd.Series([])))

0 commit comments

Comments
 (0)