Search code examples
pythonpandasnumpyeval

ValueError: unknown type object pandas eval for n rows => 100


I have the following code:

import numpy as np
import pandas as pd

length = 100

test = pd.DataFrame({
    "number1": np.random.randint(1,11,size=length),
    "sign1": np.random.choice(['*', '/'], length),
    "number2": np.random.randint(1,11,size=length),
    "sign2": np.random.choice(['+', '-'], length),
    "number3": np.random.randint(1,101,size=length),
    "random": np.random.randint(1,101,size=length),
})

test["result"] = pd.eval(test["number1"].astype(str)+test["sign1"]+test["number2"].astype(str)+\
                         test["sign2"]+test["number3"].astype(str))

where I generate some random equations and then solve them. All is working nicely if length is less than 101. If I set it to more, I get:

ValueError                                Traceback (most recent call last)
<ipython-input-87-5a65a900fe72> in <module>
     14 })
     15 
---> 16 test["result"] = pd.eval(test["number1"].astype(str)+test["sign1"]+test["number2"].astype(str)+\
     17                          test["sign2"]+test["number3"].astype(str))
~/anaconda3/lib/python3.8/site-packages/pandas/core/computation/eval.py in eval(expr, parser, engine, truediv, local_dict, global_dict, resolvers, level, target, inplace)
    344         eng = _engines[engine]
    345         eng_inst = eng(parsed_expr)
--> 346         ret = eng_inst.evaluate()
    347 
    348         if parsed_expr.assigner is None:
.
.
.

ValueError: unknown type object

Why? What is happening? And how do I fix it?


Solution

  • It is bug, need processing each value separately by apply or map:

    test["result"] = (test["number1"].astype(str)+test["sign1"]+test["number2"].astype(str)+\
                             test["sign2"]+test["number3"].astype(str)).apply(pd.eval)
    

    test["result"] = (test["number1"].astype(str)+test["sign1"]+test["number2"].astype(str)+\
                             test["sign2"]+test["number3"].astype(str)).map(pd.eval)