gpt4 book ai didi

python - AttributeError : 'PandasExprVisitor' object has no attribute 'visit_Ellipsis' , 使用 pandas eval

转载 作者:太空狗 更新时间:2023-10-29 22:17:47 24 4
gpt4 key购买 nike

我有一系列的表格:

s

0 [133, 115, 3, 1]
1 [114, 115, 2, 3]
2 [51, 59, 1, 1]
dtype: object

注意它的元素是字符串:

s[0]
'[133, 115, 3, 1]'

我正在尝试使用 pd.eval 将此字符串解析为一列列表。这适用于此示例数据。

pd.eval(s)

array([[133, 115, 3, 1],
[114, 115, 2, 3],
[51, 59, 1, 1]], dtype=object)

然而,对于更大的数据(10K 量级),这会失败得很惨!

len(s)
300000

pd.eval(s)
AttributeError: 'PandasExprVisitor' object has no attribute 'visit_Ellipsis'

我在这里错过了什么?功能或我的数据有问题吗?

最佳答案

长话短说
这无疑是 eval 中的一个错误。查看开放的 github 问题 GH16289 .


为什么会出现此错误?
这是因为 pd.eval无法解析超过 100 行的系列。这是一个例子。

len(s)
300000

pd.eval(s.head(100)) # returns a parsed result

鉴于,

pd.eval(s.head(101))
AttributeError: 'PandasExprVisitor' object has no attribute 'visit_Ellipsis'

无论解析器或引擎如何,此问题仍然存在。


这个错误是什么意思?
pd.eval 对 Series 的 __repr__ 进行操作,而不是对其中包含的对象进行操作(这是此错误的原因)。 __repr__ 截断行,将它们替换为 ...(省略号)。该省略号被引擎错误解释为 Ellipsis 对象 -

...
Ellipsis

pd.eval('...')
AttributeError: 'PandasExprVisitor' object has no attribute 'visit_Ellipsis'

pd.eval 技术上不应该解析一系列字符串(文档中提到它是为了接收字符串)并且(如接受的答案所述)将尝试做出合理的猜测结果而不是直接拒绝输入。

这是预期的行为还是不完整的行为(许多 pandas 方法根据输入以不同的方式运行 - eval 可以通过将自身映射到每一行来处理一系列,这就是我最初认为这是有效的方式)是进行讨论,因为有一个 Unresolved 问题跟踪这个。


我该怎么做才能让它发挥作用?
目前,没有解决方案(该问题截至 2017 年 12 月 28 日仍未解决),但是,有一些解决方法。

选项 1
ast.literal_eval
如果您可以保证没有任何格式错误的字符串,则此选项应该开箱即用。

from ast import literal_eval

s.apply(literal_eval)

0 [133, 115, 3, 1]
1 [114, 115, 2, 3]
2 [51, 59, 1, 1]
dtype: object

如果可能存在格式错误的数据,您需要编写一些错误处理代码。你可以用一个函数来做到这一点 -

def safe_parse(x):
try:
return literal_eval(x)
except (SyntaxError, ValueError):
return np.nan # replace with any suitable placeholder value

将此函数传递给apply -

s.apply(safe_parse)

0 [133, 115, 3, 1]
1 [114, 115, 2, 3]
2 [51, 59, 1, 1]
dtype: object

ast 适用于任意数量的行,速度慢,但可靠。您还可以对 JSON 数据使用 pd.json.loads,应用与 literal_eval 相同的想法。

选项 2
yaml.load
解析简单数据的另一个很好的选择,我 picked this up来自@ayhan 不久前。

import yaml
s.apply(yaml.load)

0 [133, 115, 3, 1]
1 [114, 115, 2, 3]
2 [51, 59, 1, 1]
dtype: object

我没有在更复杂的结构上对此进行测试,但这应该适用于几乎所有基本的数据字符串表示。

您可以找到 PyYAML 的文档 here .向下滚动一点,您会发现有关 load 函数的更多详细信息。


注意

  • 如果您正在处理 JSON 数据,使用 pd.read_json 读取您的文件可能是合适的或 pd.io.json.json_normalize开始。

  • 您还可以在读入数据时执行解析,使用 read_csv -

      s = pd.read_csv(converters=literal_eval, squeeze=True)

    converters 参数将在读取列时应用传递给该列的函数,因此您以后不必处理解析。

  • 继续上面的观点,如果您正在使用数据框,请传递一个 dict -

      df =  pd.read_csv(converters={'col' : literal_eval})

    其中col是需要解析的列您还可以传递 pd.json.loads(对于 json 数据)或 pd.eval(如果您有 100 行或更少)。


感谢 MaxU 和 Moondra 发现了这个问题。

关于python - AttributeError : 'PandasExprVisitor' object has no attribute 'visit_Ellipsis' , 使用 pandas eval,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48008191/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com