diff --git a/pandas/core/frame.py b/pandas/core/frame.py index 5603730974c7e..9337b9a23f9fe 100644 --- a/pandas/core/frame.py +++ b/pandas/core/frame.py @@ -3427,8 +3427,8 @@ def replace(self, to_replace, value=None, method='pad', axis=0, Parameters ---------- - value : scalar or dict, default None - Value to use to fill holes (e.g. 0), alternately a dict of values + value : scalar or dict or Series, default None + Value to use to fill holes (e.g. 0), alternately a dict/Series of values specifying which value to use for each column (columns not in the dict will not be filled) method : {'backfill', 'bfill', 'pad', 'ffill', None}, default 'pad' @@ -3468,8 +3468,8 @@ def replace(self, to_replace, value=None, method='pad', axis=0, return self new_data = self._data - if isinstance(to_replace, dict): - if isinstance(value, dict): # {'A' : NA} -> {'A' : 0} + if isinstance(to_replace, (dict,Series)): + if isinstance(value, (dict,Series)): # {'A' : NA} -> {'A' : 0} new_data = self._data for c, src in to_replace.iteritems(): if c in value and c in self: @@ -3501,7 +3501,7 @@ def replace(self, to_replace, value=None, method='pad', axis=0, else: # dest iterable dict-like - if isinstance(value, dict): # NA -> {'A' : 0, 'B' : -1} + if isinstance(value, (dict,Series)): # NA -> {'A' : 0, 'B' : -1} new_data = self._data for k, v in value.iteritems(): diff --git a/pandas/tests/test_frame.py b/pandas/tests/test_frame.py index f143d0fcacc2f..079f6002964a2 100644 --- a/pandas/tests/test_frame.py +++ b/pandas/tests/test_frame.py @@ -5786,6 +5786,23 @@ def test_replace_input_formats(self): expected.replace(to_rep[i], -1, inplace=True) assert_frame_equal(result, expected) + # scalar to series/dict + df = DataFrame({'zero': {'a': 0.0, 'b': 1}, 'one': {'a': 2.0, 'b': 0}}) + result = df.replace(0, {'zero': 0.5, 'one': 1.0}) + expected = DataFrame({'zero': {'a': 0.5, 'b': 1}, 'one': {'a': 2.0, 'b': 1.0}}) + assert_frame_equal(result, expected) + result = df.replace(0, df.mean()) + assert_frame_equal(result, expected) + + # series to series/dict + df = DataFrame({'zero': {'a': 0.0, 'b': 1}, 'one': {'a': 2.0, 'b': 0}}) + s = Series({'zero': 0.0, 'one': 2.0}) + result = df.replace(s, {'zero': 0.5, 'one': 1.0}) + expected = DataFrame({'zero': {'a': 0.5, 'b': 1}, 'one': {'a': 1.0, 'b': 0.0}}) + assert_frame_equal(result, expected) + result = df.replace(s, df.mean()) + assert_frame_equal(result, expected) + def test_replace_axis(self): self.tsframe['A'][:5] = nan self.tsframe['A'][-5:] = nan