【问题标题】:AttributeError: 'bool' object has no attribute 'sum' while importing SAS datasetAttributeError:“bool”对象在导入 SAS 数据集时没有属性“sum”
【发布时间】:2016-12-18 23:55:42
【问题描述】:

我正在使用 pandas.read_sas 在 Anaconda Spyder (Python 3.5) 中导入一个大约 7 GB 的巨大 sas 数据集。代码如下:

import pandas as pd
hugedata = pd.read_sas('K:/HugeData.sas7bdat')

但我收到以下错误:

Traceback (most recent call last):

  File "<ipython-input-46-31acb10b0e92>", line 1, in <module>
    hugedata = pd.read_sas('K:/ERA/Credit Risk Estimates/PRAM/NW_RM_SUB_FCLY_M_HIST.sas7bdat')

  File "C:\Users\l086276\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\io\sas\sasreader.py", line 61, in read_sas
    return reader.read()

  File "C:\Users\l086276\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\io\sas\sas7bdat.py", line 579, in read
    nd = (self.column_types == b'd').sum()

AttributeError: 'bool' object has no attribute 'sum'

只是想知道为什么对 sas7bdat.py 函数的内部调用会在导入此数据集时产生错误,而它与其他 sas 数据集完全可以正常工作。这个数据集可能出了什么问题。需要帮助。

【问题讨论】:

  • 如果您有 SAS,请尝试重写部分表并再次运行 padas。我有一个使用 SAS 9.1 创建的表,pandas 无法读取该表。但我有一个不同的错误。
  • 表由 250 个字段和 7000 万条记录组成。我需要整张桌子来进行分析。我重新运行并重新生成了表格,但仍然是我面临的同样问题。表驻留在 Teradata 服务器中,但由于表大小和服务器速度问题,将我的代码连接到服务器并不方便。

标签: python import sas anaconda attributeerror


【解决方案1】:

我发现 sas7bdat 包在 pandas 出现上述消息失败的情况下有效。

from sas7bdat import SAS7BDAT

def load_sas(sasfile,
             encoding="utf8",
             encoding_errors="replace"):

    with SAS7BDAT(sasfile, encoding=encoding,encoding_errors=encoding_errors) as sas:
        sas = iter(sas)
        columns = [c for c in next(sas)]
        df = pd.DataFrame(sas, columns=columns)
        return df

【讨论】:

  • 注意这是针对 Python2 的。对于 Python3,您需要将 .next() 更改为 .__next__() stackoverflow.com/questions/1073396/…
  • 如果这是推荐的方法,它似乎有点坏了。如果在 Python 中总是将 __ 理解为“私有”,那么您应该直接调用它,并且应该期望它在某些情况下会失败。 stackoverflow.com/questions/1301346/…
  • 该页面下方的一些答案说“这只是一个约定,是 Python 系统使用不会与用户名冲突的名称的一种方式。”并且“通常为内置方法或变量保留”,那么何时使用 .__next__() 会失败?我一直使用 .__file__ 来查找模块代码的位置,我认为 .__version__ 会告诉您版本。
  • 希望我可以编辑第一条评论。查看我链接的答案,似乎 Python3 应该使用 next(sas) 而不是 sas.__next__()
猜你喜欢
  • 1970-01-01
  • 2021-07-06
  • 1970-01-01
  • 2022-07-01
  • 2023-01-26
  • 1970-01-01
  • 2021-07-28
  • 1970-01-01
  • 2020-08-06
相关资源
最近更新 更多