2017-07-27 63 views
3

我正在看熊猫DataFrame eval方法(docs),我发现一个很好的语法糖,也可以帮助enhancing performances大熊猫DataFrame评论与列名空间

这是从文档的例子:

from numpy.random import randn 
import pandas as pd 

df = pd.DataFrame(randn(10, 2), columns=list('ab')) 
df.eval('a + b') 

如何使用eval当在我的列名的空间? 例子:

df = pd.DataFrame(randn(10, 2), columns=["Col 1", "Col 2"]) 

我尝试这样做:

df.eval('"Col 1" + "Col 2"') 

,但是这给了错误:

TypeError: data type "Col 1" not understood 
+1

由于它不是一种内置方法,所以* DataFrame *需要按照Python规则进行限定。你可能意思是'pd.DateFrame'或'从pandas导入DataFrame'? – Parfait

回答

2

可以使用这样做:

df.eval(df["Col 1"] + df["Col 2"]) 

但是,这是一种反对t他评估函数的目的。

df.columns = df.columns.map(lambda x: x.replace(' ', '_')) 
+0

是的,一致认为它是违背eval函数的目的:) – FLab

+0

++重新命名列 – MaxU

+0

我刚测试过它......'df.query(“Col_1 + Col_2”)'在重命名列后给了我'KeyError'。 'pd.eval(“df.Col_1 + df.Col_2”)'起作用,但与DataFrame.eval()相比并不那么方便...... IMO ... – MaxU

1
pd.eval('df["Col 1"] + df["Col 2"]') 

这使参数EVAL作为一个字符串,但比没有空格的例子不干净:

或者,也可以以使它们与EVAL语法兼容重命名列在列名

例如:

print(df) 

     Col 1  Col 2 
0 -0.206838 -1.007173 
1 -0.762453 1.178220 
2 -0.431943 -0.804775 
3 0.830659 -0.244472 
4 0.111637 0.943254 
5 0.206615 0.436250 
6 -0.568307 -0.680140 
7 -0.127645 -0.098351 
8 0.185413 -1.224999 
9 0.767931 1.512654 

print(pd.eval('df["Col 1"] + df["Col 2"]')) 

0 -1.214011 
1 0.415768 
2 -1.236718 
3 0.586188 
4 1.054891 
5 0.642865 
6 -1.248447 
7 -0.225995 
8 -1.039586 
9 2.280585 
dtype: float64 

编辑

经过一番调查后,它看起来像上面的方法在任何蟒蛇2.7或3.6的工作,如果你正在使用Python引擎:

pd.eval('df["Col 1"] + df["Col 2"]', engine='python') 

然而,这并不会给你的性能优势发动机可以提供numexpr。在Python 2.7版,这个方法的工作原理:

pd.eval('df["Col 1"] + df["Col 2"]', engine='numexpr') 

但是在Python 3.6你的错误ValueError: unknown type str160

我的猜测是,这是因为熊猫传递一个unicode字符串到3.6中的numexpr,而2.7中的字节串。我猜这个问题与this issuethis one有关。

+0

你测试了吗?它给了我'ValueError:未知类型str160'(Pandas 0.20.1)。你的Pandas版本是什么? – MaxU

+0

@MaxU,我相信如此...(见例子)。你会推荐进一步的测试吗? – bunji

+0

你能指定你的Pandas版本吗?我想自己测试它... – MaxU