Python无法将300万条记录写入.xpt sas数据集

xpcnnkqh  于 2023-05-16  发布在  Python
关注(0)|答案(1)|浏览(192)

我有一个有300万条记录的pandas dataframe,但无法将大型dataframe写入.xpt文件。尽管相同的脚本适用于具有200万条记录的其他 Dataframe ,但不需要修改任何内容。
在写的时候,我正在使用df.from_dataframe()函数,在写xpt文件的时候,几分钟后,我突然在控制台上收到“KILLED”消息。

  • 系统- RHEL Linux
  • Python - 3.7
  • Pandas版本-1.2
  • 在编写时使用带有.v56子包的导出模块。

需要以下方面的指导

  • 这是内存泄漏的情况吗
  • Dataframe 中有任何错误数据的可能性

调试单个内置函数的正确方法是什么?
不确定以.xpt格式将pandas dataframe写入sas数据集的功能。

axr492tv

axr492tv1#

xport的GitHub页面上报告了一个related error,并在xport的一个版本中得到了解决,不幸的是,该版本与pandas==1.2.4不兼容
我用pandas==1.2.4xport==3.2.1(与此pandas版本兼容的最高版本的xport)运行了下面的代码,它给了我以下错误:NotImplementedError: Can't copy SAS variable metadata to dataframe
一旦升级到pandas==1.3.5xport==3.6.1,代码就像一个魅力。好消息是pandas==1.3.5根据其official doc仍然可以在Python 3.7.1及更高版本上工作
代码(来自xport文档的示例代码,带有一些修改):

import pandas as pd
import xport
import xport.v56

# create list with 3 million items each
alpha_list = [10, 20, 30] * 1_000_000
beta_list = ['x', 'y', 'z'] * 1_000_000

df = pd.DataFrame({
    'alpha': alpha_list,
    'beta': beta_list
})

ds = xport.Dataset(df, name='DATA', label='Wonderful data')

# Variable names are limited to 8 characters in SAS transport
# files (.xpt). In SAS datasets, variable names may be up to 
# 32 characters  As with Pandas dataframes, you must change the
# name on the dataset rather than the column directly.
ds = ds.rename(columns={k: k.upper()[:8] for k in ds})

# Other SAS metadata can be set on the columns themselves.
for k, v in ds.items():
    v.label = k.title()
    if v.dtype == 'object':
        v.format = '$CHAR20.'
    else:
        v.format = '10.2'

# Libraries can have multiple datasets.
library = xport.Library({'DATA': ds})

with open('example.xpt', 'wb') as f:
    xport.v56.dump(library, f)
    
# load exported file to check if everything's working
df = pd.read_sas('example.xpt')

print(df.head(n=10).to_markdown(index=False))

打印:

|   ALPHA | BETA   |
|--------:|:-------|
|      10 | x      |
|      20 | y      |
|      30 | z      |
|      10 | x      |
|      20 | y      |
|      30 | z      |
|      10 | x      |
|      20 | y      |
|      30 | z      |
|      10 | x      |

相关问题