diff --git a/bigframes/series.py b/bigframes/series.py index c2137bca35..a166680f85 100644 --- a/bigframes/series.py +++ b/bigframes/series.py @@ -581,6 +581,9 @@ def _simple_replace(self, to_replace_list: typing.Sequence, value): return Series(block.select_column(result_col)) def _mapping_replace(self, mapping: dict[typing.Hashable, typing.Hashable]): + if not mapping: + return self.copy() + tuples = [] lcd_types: list[typing.Optional[bigframes.dtypes.Dtype]] = [] for key, value in mapping.items(): @@ -597,6 +600,7 @@ def _mapping_replace(self, mapping: dict[typing.Hashable, typing.Hashable]): result_dtype = functools.reduce( lambda t1, t2: bigframes.dtypes.lcd_type(t1, t2) if (t1 and t2) else None, lcd_types, + self.dtype, ) if not result_dtype: raise NotImplementedError( @@ -605,7 +609,9 @@ def _mapping_replace(self, mapping: dict[typing.Hashable, typing.Hashable]): block, result = self._block.apply_unary_op( self._value_column, ops.MapOp(tuple(tuples)) ) - return Series(block.select_column(result)) + replaced = Series(block.select_column(result)) + replaced.name = self.name + return replaced @validations.requires_ordering() @validations.requires_index diff --git a/tests/system/small/test_series.py b/tests/system/small/test_series.py index fe6e001797..7458187a82 100644 --- a/tests/system/small/test_series.py +++ b/tests/system/small/test_series.py @@ -458,6 +458,29 @@ def test_series_replace_list_scalar(scalars_dfs): ) +@pytest.mark.parametrize( + ("replacement_dict",), + ( + ({"Hello, World!": "Howdy, Planet!", "T": "R"},), + ({},), + ), + ids=[ + "non-empty", + "empty", + ], +) +def test_series_replace_dict(scalars_dfs, replacement_dict): + scalars_df, scalars_pandas_df = scalars_dfs + col_name = "string_col" + bf_result = scalars_df[col_name].replace(replacement_dict).to_pandas() + pd_result = scalars_pandas_df[col_name].replace(replacement_dict) + + pd.testing.assert_series_equal( + pd_result, + bf_result, + ) + + @pytest.mark.parametrize( ("method",), (