pandas.eval在官方文档中提示到的有点是执行高效率,同时可以使用字符串表达式进行计算,那么对于一些数学校验来说,是十分方便的。
df = pd.DataFrame(dict(a=range(5), b=range(5, 10))) df.loc[0,'a'] = np.nan
df.eval(""" c = a + b d = a + b + c a = 1 f = (c>5) or (d > 9)""", inplace=False)
可以方便的得出校验。但是在使用中有以下问题:
1、NAN值问题,NAN值会无法计算。因此执行前,需要先替换掉NAN值.
df.fillna(0.0,inplace=True) # 这个效果好点,df.isnull()如果遇到多类型数据会报错
#df[df.isnull()] = 0.0 df.eval(""" c = a + b d = a + b + c a = 1 f = (c>5) or (d > 9)""", inplace=False)
2、如果计算的键值不存在,会报错。
# 会提示KeyError df.eval('e + b')
因此,需要先对列重新进行修正再进行计算。
#进行去重
df = df.reindex(columns = list(set(list(df.columns) + ['e'])),fill_value = 0) df.eval('e + b')
综上所述:
1、使用前,需要对数据缺失值进行预处理;
2、需要对字符串表达式进行解析,然后重新构建数据列值。所以,最后还需要对表达式进行解析,提取里面的键值。