diff --git a/pandas/core/computation/ops.py b/pandas/core/computation/ops.py index f06ded6d9f98e..1d6b063d82dde 100644 --- a/pandas/core/computation/ops.py +++ b/pandas/core/computation/ops.py @@ -19,6 +19,7 @@ from pandas.core.dtypes.common import ( is_list_like, is_scalar, + pandas_dtype, ) import pandas.core.common as com @@ -238,7 +239,7 @@ def return_type(self): @property def has_invalid_return_type(self) -> bool: types = self.operand_types - obj_dtype_set = frozenset([np.dtype("object")]) + obj_dtype_set = frozenset([np.dtype("object"), str, pandas_dtype("string")]) return self.return_type == object and types - obj_dtype_set @property diff --git a/pandas/tests/computation/test_eval.py b/pandas/tests/computation/test_eval.py index 3c0bf6c35866c..a2319067d6052 100644 --- a/pandas/tests/computation/test_eval.py +++ b/pandas/tests/computation/test_eval.py @@ -743,6 +743,13 @@ def test_eval_keep_name(self, engine, parser): expected = Series([4, 30, 56], name="a") tm.assert_series_equal(expected, res) + def test_obj_str_addition(self): + # GH 47734 + df = DataFrame({"a": ["a", "b"]}) + res = df.eval("a + 'a'", engine="python") + expected = Series(["aa", "ba"], name="a") + tm.assert_series_equal(expected, res) + def test_eval_unmatching_names(self, engine, parser): variable_name = Series([42], name="series_name") res = pd.eval("variable_name + 0", engine=engine, parser=parser)