Pandas DataFrame eval,列名称中包含空格

时间:2017-07-27 12:39:28

标签: python pandas dataframe eval

我正在查看pandas DataFrame eval方法(docs),我找到了一个很好的语法糖,也可以帮助enhancing performances

这是文档中的示例:

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

3 个答案:

答案 0 :(得分:3)

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

这会将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

编辑

经过一番调查后,如果你使用python引擎,看起来上面的方法在python 2.7或3.6中都有效:

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

我的猜测是,这是因为pandas在3.6中将一个unicode字符串传递给numexpr,而在2.7中传递了一个bytestring。我猜这个问题与this issue有关,也可能与this one有关。

答案 1 :(得分:2)

您可以使用以下方式执行此操作:

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

但这与eval函数的目的背道而驰。

或者,您可以重命名列以使其与eval语法兼容:

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

答案 2 :(得分:0)

谢谢@Thundzz

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

此代码段效果很好!

相关问题