【问题标题】:Pandas DataFrame eval with space in column names [duplicate]Pandas DataFrame eval 列名中带有空格 [重复]
【发布时间】:2018-01-03 04:48:36
【问题描述】:

我正在查看 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

【问题讨论】:

  • 由于不是内置方法,DataFrame需要根据Python规则进行限定。您的意思可能是pd.DateFramefrom pandas import DataFrame
  • @cs95 这怎么可能是这个问题一年后提出的问题的重复?
  • 不必按时间顺序询问重复项。我关闭了这个,因为那里有一个答案,解释了如何使用反引号来支持 0.25 中的空格。
  • 感谢您的澄清

标签: python pandas dataframe eval


【解决方案1】:

谢谢@Thundzz

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

这个 sn-p 效果很好!

【讨论】:

  • 这实际上并没有回答问题;相反,它会忽略问题并通过下划线间隔来解决问题。
【解决方案2】:
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 中传递了一个字节串。我猜这个问题与this issuethis one 有关。

【讨论】:

  • @MaxU 使用engine='python'
  • @MaxU 是的。我刚刚在另一台安装了 numexpr 的机器上试了一下,得到了同样的错误。接得好。这真的太糟糕了,因为 numexpr 是首先提供性能优势的原因。
  • @MaxU 看起来错误是因为pandas将unicode字符串传递给numexpr。因此,有趣的是,在 python 2.7 中,它使用 numexpr 引擎工作,因为它正在传递 numexpr 可以处理的字节串。
  • @bunji,此外 - 如果我们在列名中用下划线替换空格 - df.eval("Col_1 + Col_2") 在 Python 2.7 中有效,在 Python 3.6 中无效...
  • 对于那些真正想知道答案的人,请查看显示“重复”问题的问题:使用反引号。应该工作的是df.eval('`col 1` + `col 2`')
【解决方案3】:

您可以这样做:

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

但这有点违背 eval 函数的目的。

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

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

【讨论】:

  • 是的,同意这违背了 eval 函数的目的:)
  • ++ 用于重命名列
  • 我刚刚测试了它...df.query("Col_1 + Col_2") 重命名列后给了我KeyErrorpd.eval("df.Col_1 + df.Col_2") 有效,但与 DataFrame.eval() IMO 相比,它不是那么方便......
  • @MaxU 这实际上对我有用,你可以在截图中看到:prnt.sc/g0zeh5
  • @Thundzz,是的,请查看我对 bunji 答案的最后评论... ;-)
猜你喜欢
  • 2019-07-21
  • 2021-04-24
  • 2019-11-26
  • 2014-01-19
  • 2017-05-10
  • 2019-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多