From c93e69a8a04d2561dfbcd08e492fb509cc8d1bb9 Mon Sep 17 00:00:00 2001 From: Daniel Isaac Date: Sat, 1 Feb 2025 21:53:33 +0530 Subject: [PATCH 1/3] fix for df.eval can't concatenate string column and string via + --- pandas/core/computation/ops.py | 2 +- pandas/tests/computation/test_eval.py | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/pandas/core/computation/ops.py b/pandas/core/computation/ops.py index 9b26de42e119b..0bd2b10a1da67 100644 --- a/pandas/core/computation/ops.py +++ b/pandas/core/computation/ops.py @@ -238,7 +238,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]) 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..e7d7285d9b98d 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, engine, parser): + # 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) From 37371641c0e3206ca07c34a9df6d268830e81b74 Mon Sep 17 00:00:00 2001 From: Daniel Isaac Date: Sun, 16 Feb 2025 13:17:49 +0530 Subject: [PATCH 2/3] 47734: updates for infer string tests --- pandas/core/computation/ops.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pandas/core/computation/ops.py b/pandas/core/computation/ops.py index 0bd2b10a1da67..eba8be457e84a 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"), str]) + obj_dtype_set = frozenset([np.dtype("object"), str, pandas_dtype("string")]) return self.return_type == object and types - obj_dtype_set @property From 1c7ce4a8f66d56605a2095116633a7cb7c599454 Mon Sep 17 00:00:00 2001 From: Daniel Isaac Date: Sun, 16 Feb 2025 13:20:27 +0530 Subject: [PATCH 3/3] 47734: updates for infer string tests --- pandas/tests/computation/test_eval.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/tests/computation/test_eval.py b/pandas/tests/computation/test_eval.py index e7d7285d9b98d..a2319067d6052 100644 --- a/pandas/tests/computation/test_eval.py +++ b/pandas/tests/computation/test_eval.py @@ -743,7 +743,7 @@ 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, engine, parser): + def test_obj_str_addition(self): # GH 47734 df = DataFrame({"a": ["a", "b"]}) res = df.eval("a + 'a'", engine="python")