首页 > 编程问答 >具有块大小选项的 Python pandas read_sas 因索引不匹配而失败并出现值错误

具有块大小选项的 Python pandas read_sas 因索引不匹配而失败并出现值错误

时间:2024-07-21 03:01:36浏览次数:11  
标签:python pandas sas

我有一个非常大的 SAS 文件,无法容纳在我的服务器内存中。我只需要转换为镶木地板格式的文件。为此,我使用 pandas 中 chunksize 方法的 read_sas 选项分块读取它。它主要是在工作/做它的工作。除此之外,一段时间后它会失败并出现以下错误。

此特定 SAS 文件有 79422642 行数据。目前尚不清楚为什么它在中间失败。

import pandas as pd

filename = 'mysasfile.sas7bdat'
SAS_CHUNK_SIZE = 2000000

sas_chunks = pd.read_sas(filename, chunksize = SAS_CHUNK_SIZE, iterator = True)
for sasDf in sas_chunks:
    print(sasDf.shape)


(2000000, 184)
(2000000, 184)
(2000000, 184)
(2000000, 184)
(2000000, 184)
(2000000, 184)
(2000000, 184)
(2000000, 184)
(2000000, 184)
(2000000, 184)
(2000000, 184)
(2000000, 184)
(2000000, 184)
(2000000, 184)
(2000000, 184)
(2000000, 184)
(2000000, 184)
(2000000, 184)
(2000000, 184)
(2000000, 184)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/opt/anaconda3/lib/python3.10/site-packages/pandas/io/sas/sas7bdat.py", line 340, in __next__
    da = self.read(nrows=self.chunksize or 1)
  File "/opt/anaconda3/lib/python3.10/site-packages/pandas/io/sas/sas7bdat.py", line 742, in read
    rslt = self._chunk_to_dataframe()
  File "/opt/anaconda3/lib/python3.10/site-packages/pandas/io/sas/sas7bdat.py", line 795, in _chunk_to_dataframe
    rslt[name] = pd.Series(self._string_chunk[js, :], index=ix)
  File "/opt/anaconda3/lib/python3.10/site-packages/pandas/core/series.py", line 461, in __init__
    com.require_length_match(data, index)
  File "/opt/anaconda3/lib/python3.10/site-packages/pandas/core/common.py", line 571, in require_length_match
    raise ValueError(
ValueError: Length of values (2000000) does not match length of index (1179974)

我刚刚使用较小的块大小在行数较少的较小 SAS 文件上测试了相同的代码逻辑,如下所示,它似乎工作正常,没有任何错误,并且还处理小于块大小参数的最后剩余块:

filename = 'mysmallersasfile.sas7bdat'
SAS_CHUNK_SIZE = 1000

sas_chunks = pd.read_sas(filename, chunksize = SAS_CHUNK_SIZE, iterator = True)
for sasDf in sas_chunks:
     print(sasDf.shape)

(1000, 5)
(1000, 5)
(1000, 5)
(1000, 5)
(983, 5)


这个错误信息“ValueError: Length of values (2000000) does not match length of index (1179974)”表明,当创建 Pandas DataFrame 时,出现了不一致的情况。代码试图用 2,000,000 个新值创建一个 DataFrame 列,但索引只有 1,179,974 个条目。

虽然不是立即明显的,但基于在大型 SAS 文件中循环的次数(20 次迭代),问题似乎出在 SAS 文件中包含缺失值的行 。Pandas 可能以不同的方式处理这些缺失值,导致索引和数据值的长度不匹配。

以下是一些解决此问题的步骤:

  1. 处理缺失值: 使用 na_values keep_default_na 参数在 read_sas 函数中处理缺失值。这将确保 Pandas 在读取数据时一致地处理缺失值。

python sas_chunks = pd.read_sas(filename, chunksize=SAS_CHUNK_SIZE, iterator=True, na_values=['.', 'NA'])

  1. 验证数据完整性: 检查每个块中的行数,以确保读取的数据与预期一致。

python total_rows = 0 for i, sasDf in enumerate(sas_chunks): print(f"Chunk {i+1}: {sasDf.shape[0]} rows") total_rows += sasDf.shape[0] print(f"Total rows read: {total_rows}")

  1. 逐步调试: 如果问题仍然存在,请尝试使用较小的块大小或逐步调试代码,以确定导致错误的特定块或列。

通过在读取数据时显式处理缺失值并验证数据完整性,可以解决此错误并确保的代码在处理大型 SAS 文件时可靠地工作。

此外,考虑以下因素:

  • Pandas 和 read_sas 的版本: 确保使用的是最新版本的 Pandas,因为它可能包含对 read_sas 功能的错误修复或改进。
  • SAS 文件结构: 复杂的 SAS 文件结构或数据类型可能会导致问题。如果可能,请尝试简化文件结构或将其转换为更标准的格式。

通过遵循这些步骤,应该能够解决问题并成功地将大型 SAS 文件转换为 Parquet 格式。

标签:python,pandas,sas
From: 78757169

相关文章

  • 使用 requests 包 python 时打开文件太多
    我正在使用Pythonrequests包向API发出大量请求。然而,在某些时候,我的程序由于“打开的文件太多”而崩溃。当我明确关闭我的会话时,我真的不知道这是怎么回事。我使用以下代码:importrequestsimportmultiprocessingimportnumpyasnps=requests.session()s.keep......
  • Python 是一种选择性解释语言吗?为什么下面的代码不起作用?
    由于程序是从上到下运行的,为什么下面的代码不执行块中的第一行就直接抛出错误?if5>2:print("TwoislessthanFive!")print("Fiveisgreaterthantwo!")错误:文件“/Users/____/Desktop/Pythonpractise/practise.py”,第3行print("五比二大!")Indentati......
  • Pandas 哈希表给出 key error:0 和 get_item
    我试图获取两个pandas数据表的相同元素,对数据进行索引并将其合并。我将它用于大量数据(数百万)。第一个表(df)是恒定的,第二个表(d2)在每个循环中都在变化,新元素将与第一个表合并。这是我的此过程的代码:df=pd.read_csv("inputfile.csv",header=None)d1=pd.DataFram......
  • 裁剪时间变量 Python Matplotlib Xarray
    我不确定这是否是一个愚蠢的问题,但我想按时间变量剪辑.nc文件。我在xarray中打开了数据集,但以下ds.sel行(之前已运行)仅返回错误。ds=xr.open_dataset('/Users/mia/Desktop/RMP/data/tracking/mcs_tracks_2015_11.nc')selected_days=ds.sel(time=slice('2015-11-22',......
  • 用于匹配两个数据列表中的项目的高效数据结构 - python
    我有两个列表,其中一个列表填充ID,另一个列表填充进程名称。多个进程名称可以共享一个ID。我希望能够创建一个可以使用特定ID的数据结构,然后返回与该ID关联的进程列表。我还希望能够使用特定的进程名称并返回与其连接的ID列表。我知道我可以为此创建一个字典,但是I......
  • 有人可以解决我的代码中的问题吗?而且我无法在我的电脑上安装 nsetools。如何在 python
    从nsetools导入Nseimportpandasaspdnse=Nse()all_stock_codes=nse.get_stock_codes()companies_with_low_pe=[]对于all_stock_codes中的代码:如果代码=='符号':继续尝试:stock_quote=nse.get_quote(代码)pe_ratio=stock_quote.get('priceT......
  • 如何填充用 geopandas 溶解地理数据框时创建的多多边形中的孔?
    我的目标是绘制MSOA(英国的连续地理单位)集群的边界,为此我从此处下载了MSOA边界的shapefile。然后,我添加一列簇标签并使用geopandas进行溶解。df.dissolve(by='label',aggfunc='sum')当我使用Folium绘制时,有多个内孔,如附图所示。我该如何删除这些?#create......
  • 将 python 脚本的 stdin 重定向到 fifo 会导致 RuntimeError: input():lost sys.stdin
    我有这个python脚本,它的作用是充当服务器,它从重定向到fifo的stdin读取命令:test.py:whileTrue:try:line=input()exceptEOFError:breakprint(f'Received:{line}')在bash中运行命令:mkfifotestfifotest.py<testfifo......
  • Python/Flask mysql 游标:为什么它不起作用?
    fromflaskimportFlaskfromflask_mysqldbimportMySQLapp=Flask(__name__)app.config['MYSQL_HOST']='localhost'app.config['MYSQL_USER']='root'app.config['MYSQL_PASSWORD']='password'a......
  • Python pandas to_csv 导致 OSError: [Errno 22] 参数无效
    我的代码如下:importpandasaspdimportnumpyasnpdf=pd.read_csv("path/to/my/infile.csv")df=df.sort_values(['distance','time'])df.to_csv("path/to/my/outfile.csv")此代码成功从infile.csv(一个3GBcsv文件)读取数据,对其进行排......