Skip to content

Commit ce86f55

Browse files
authored
BUG: allow use of both default+input resolvers in df.eval, GH34966 (#45134)
1 parent 1696c0f commit ce86f55

File tree

3 files changed

+16
-6
lines changed

3 files changed

+16
-6
lines changed

doc/source/whatsnew/v1.4.0.rst

+1
Original file line numberDiff line numberDiff line change
@@ -1000,6 +1000,7 @@ Other
10001000
- Bug in :meth:`DataFrame.diff` when passing a NumPy integer object instead of an ``int`` object (:issue:`44572`)
10011001
- Bug in :meth:`Series.replace` raising ``ValueError`` when using ``regex=True`` with a :class:`Series` containing ``np.nan`` values (:issue:`43344`)
10021002
- Bug in :meth:`DataFrame.to_records` where an incorrect ``n`` was used when missing names were replaced by ``level_n`` (:issue:`44818`)
1003+
- Bug in :meth:`DataFrame.eval` where ``resolvers`` argument was overriding the default resolvers (:issue:`34966`)
10031004

10041005
.. ***DO NOT USE THIS SECTION***
10051006

pandas/core/frame.py

+4-6
Original file line numberDiff line numberDiff line change
@@ -4224,15 +4224,13 @@ def eval(self, expr: str, inplace: bool = False, **kwargs):
42244224
from pandas.core.computation.eval import eval as _eval
42254225

42264226
inplace = validate_bool_kwarg(inplace, "inplace")
4227-
resolvers = kwargs.pop("resolvers", None)
42284227
kwargs["level"] = kwargs.pop("level", 0) + 1
4229-
if resolvers is None:
4230-
index_resolvers = self._get_index_resolvers()
4231-
column_resolvers = self._get_cleaned_column_resolvers()
4232-
resolvers = column_resolvers, index_resolvers
4228+
index_resolvers = self._get_index_resolvers()
4229+
column_resolvers = self._get_cleaned_column_resolvers()
4230+
resolvers = column_resolvers, index_resolvers
42334231
if "target" not in kwargs:
42344232
kwargs["target"] = self
4235-
kwargs["resolvers"] = kwargs.get("resolvers", ()) + tuple(resolvers)
4233+
kwargs["resolvers"] = tuple(kwargs.get("resolvers", ())) + resolvers
42364234

42374235
return _eval(expr, inplace=inplace, **kwargs)
42384236

pandas/tests/frame/test_query_eval.py

+11
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,17 @@ def test_eval_resolvers_as_list(self):
165165
assert df.eval("a + b", resolvers=[dict1, dict2]) == dict1["a"] + dict2["b"]
166166
assert pd.eval("a + b", resolvers=[dict1, dict2]) == dict1["a"] + dict2["b"]
167167

168+
def test_eval_resolvers_combined(self):
169+
# GH 34966
170+
df = DataFrame(np.random.randn(10, 2), columns=list("ab"))
171+
dict1 = {"c": 2}
172+
173+
# Both input and default index/column resolvers should be usable
174+
result = df.eval("a + b * c", resolvers=[dict1])
175+
176+
expected = df["a"] + df["b"] * dict1["c"]
177+
tm.assert_series_equal(result, expected)
178+
168179
def test_eval_object_dtype_binop(self):
169180
# GH#24883
170181
df = DataFrame({"a1": ["Y", "N"]})

0 commit comments

Comments
 (0)