结合实际案例,所有操作都是本人亲自实践,作为以后自己使用pandas时的用户手册。
目录
1 支持的语法
pd.eval()具有3个特点:
(1)DataFrame数量很大(一般超过10000行)时更高效;
(2)基本的运算、布尔表达等速度非常快,具体支持的语法为:
- 算术运算,比如df+2*Pi
- 比较,比如df>2
- 列表或元组,比如[1,2]
- 属性,比如df['A']
- 下标表达式,比如df[2]
- 数学函数,比如sin/log/exp等
(3)有一些语法,是不建议使用的:
- 函数
- is/not is
- if表达
- lambda表达
- Generator
2 例子说明
我创建了4个20000*100的表格,来看eval()在简单运算所带来的提升。
rows,columns=20000,100
test1,test2,test3,test4=[pd.DataFrame(np.random.randn(rows,columns)) for i in range(4)]
3 内容表达
我们还可以直接把简明的表达式写入eval(),此时表达式不用前面加入表格名称。
下面是名称为“expression_table”的表格:
# 通过eval()表达
expression_table.eval('C=A+B',inplace=True)
# 通过原来的Pands表达
expression_table['C']=expression_table['A']+expression_table['B']
4 局部变量
如果eval()中调用局部变量,必须前面引用“@”,否则pandas会报错。
# 局部变量
column_new=np.random.randn(len(expression_table))
expression_table.eval("E=B+@column_new",inplace=True)
5 解析器
eval()有两种解析器,一种是通常使用的"pyhton"解析器,一种是更加直白简单的“pandas”解析器。
6 实例分析
下面两个图是别人分析的,用于演示eval()表现效果的示意图。
(1)当数据量少的时候,比如10000-20000左右,pandas和eval()区别不大:
(2)当数据量达到一定量级,eval()的优势就越来越大: