From ef03d59d31aa606e45143b20ede855d5511657e4 Mon Sep 17 00:00:00 2001 From: Tom Bird Date: Tue, 30 Aug 2016 14:12:51 +0100 Subject: [PATCH 1/4] BUG: #14095. Amend eval() resolvers kwarg to accept lists --- doc/source/whatsnew/v0.19.0.txt | 1 + pandas/core/frame.py | 2 +- pandas/tests/frame/test_query_eval.py | 6 ++++++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/doc/source/whatsnew/v0.19.0.txt b/doc/source/whatsnew/v0.19.0.txt index 45cdd23140487..2c5309c485bba 100644 --- a/doc/source/whatsnew/v0.19.0.txt +++ b/doc/source/whatsnew/v0.19.0.txt @@ -1290,3 +1290,4 @@ Bug Fixes - Bug in ``.to_string()`` when called with an integer ``line_width`` and ``index=False`` raises an UnboundLocalError exception because ``idx`` referenced before assignment. - Bug in ``read_csv()``, where aliases for utf-xx (e.g. UTF-xx, UTF_xx, utf_xx) raised UnicodeDecodeError (:issue:`13549`) +- Bug in ``eval()`` where the ``resolvers`` argument would not accept a list (:issue`14095`) diff --git a/pandas/core/frame.py b/pandas/core/frame.py index 205af5c805877..6686f9f59b6d0 100644 --- a/pandas/core/frame.py +++ b/pandas/core/frame.py @@ -2266,7 +2266,7 @@ def eval(self, expr, inplace=None, **kwargs): resolvers = dict(self.iteritems()), index_resolvers if 'target' not in kwargs: kwargs['target'] = self - kwargs['resolvers'] = kwargs.get('resolvers', ()) + resolvers + kwargs['resolvers'] = kwargs.get('resolvers', ()) + tuple(resolvers) return _eval(expr, inplace=inplace, **kwargs) def select_dtypes(self, include=None, exclude=None): diff --git a/pandas/tests/frame/test_query_eval.py b/pandas/tests/frame/test_query_eval.py index 49b0ce66999d8..7fa4275014c1d 100644 --- a/pandas/tests/frame/test_query_eval.py +++ b/pandas/tests/frame/test_query_eval.py @@ -147,6 +147,12 @@ def test_query_non_str(self): with tm.assertRaisesRegexp(ValueError, msg): df.query(111) + def test_eval_resolvers_as_list(self): + df = DataFrame(randn(10, 2), columns=list('ab')) + dict1 = {'a': 1} + dict2 = {'b': 2} + self.assertTrue(df.eval('a + b', resolvers=[dict1, dict2]) == dict1['a'] + dict2['b']) + class TestDataFrameQueryWithMultiIndex(tm.TestCase): From 77500da26e469e90da86789022d522e6fbf78408 Mon Sep 17 00:00:00 2001 From: Tom Bird Date: Tue, 30 Aug 2016 15:06:41 +0100 Subject: [PATCH 2/4] BUG: #14095. Amend eval() resolvers kwarg to accept lists --- pandas/tests/frame/test_query_eval.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pandas/tests/frame/test_query_eval.py b/pandas/tests/frame/test_query_eval.py index 7fa4275014c1d..fa4bdc28e05b7 100644 --- a/pandas/tests/frame/test_query_eval.py +++ b/pandas/tests/frame/test_query_eval.py @@ -151,7 +151,8 @@ def test_eval_resolvers_as_list(self): df = DataFrame(randn(10, 2), columns=list('ab')) dict1 = {'a': 1} dict2 = {'b': 2} - self.assertTrue(df.eval('a + b', resolvers=[dict1, dict2]) == dict1['a'] + dict2['b']) + self.assertTrue(df.eval('a + b', resolvers=[dict1, dict2]) + == dict1['a'] + dict2['b']) class TestDataFrameQueryWithMultiIndex(tm.TestCase): From f27963cc3179c99cc7591bcd0a49618bee408a61 Mon Sep 17 00:00:00 2001 From: Tom Bird Date: Tue, 30 Aug 2016 17:13:28 +0100 Subject: [PATCH 3/4] BUG: #14095. Amend eval() resolvers kwarg to accept lists --- pandas/tests/frame/test_query_eval.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pandas/tests/frame/test_query_eval.py b/pandas/tests/frame/test_query_eval.py index fa4bdc28e05b7..274991790c3ef 100644 --- a/pandas/tests/frame/test_query_eval.py +++ b/pandas/tests/frame/test_query_eval.py @@ -151,8 +151,8 @@ def test_eval_resolvers_as_list(self): df = DataFrame(randn(10, 2), columns=list('ab')) dict1 = {'a': 1} dict2 = {'b': 2} - self.assertTrue(df.eval('a + b', resolvers=[dict1, dict2]) - == dict1['a'] + dict2['b']) + self.assertTrue(df.eval('a + b', resolvers=[dict1, dict2]) == + dict1['a'] + dict2['b']) class TestDataFrameQueryWithMultiIndex(tm.TestCase): From 227d734807ee018ac0ba74178347b9dd2c6e4a58 Mon Sep 17 00:00:00 2001 From: Tom Bird Date: Wed, 31 Aug 2016 15:47:39 +0100 Subject: [PATCH 4/4] BUG: #14095. Amend eval() resolvers kwarg to accept lists --- pandas/tests/frame/test_query_eval.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pandas/tests/frame/test_query_eval.py b/pandas/tests/frame/test_query_eval.py index 274991790c3ef..b563ce5778f84 100644 --- a/pandas/tests/frame/test_query_eval.py +++ b/pandas/tests/frame/test_query_eval.py @@ -153,6 +153,8 @@ def test_eval_resolvers_as_list(self): dict2 = {'b': 2} self.assertTrue(df.eval('a + b', resolvers=[dict1, dict2]) == dict1['a'] + dict2['b']) + self.assertTrue(pd.eval('a + b', resolvers=[dict1, dict2]) == + dict1['a'] + dict2['b']) class TestDataFrameQueryWithMultiIndex(tm.TestCase):