我无法使用带有python

时间:2017-05-22 20:16:30

标签: python spss

我有一些.sav文件,我想检查坏数据。坏数据的含义与问题无关。我已经在python中使用spss模块编写了一个脚本来检查案例,如果它们不好就删除它们。我通过定义数据集对象然后获取其案例列表在datastep中执行此操作。然后我用

del datasetObj.cases[k] 

删除datastep中的有问题的案例。

这是我的问题:

假设我有一个数据集foo.sav并且它是spss中的活动数据集,那么我可以运行类似的东西:

BEGIN PROGRAM PYTHON.
import spss
spss.StartDataStep()
datasetObj = spss.Dataset()
caselist = datasetObj.cases
del caselist[k]
spss.EndDataStep()
END PROGRAM.

从spss客户端内部,它将从数据集foo.sav中删除案例k。但是,如果我使用foo.sav目录作为工作目录运行类似下面的内容:

import os, spss

pathname = os.curdir()

foopathname = os.path.join(pathname, 'foo.sav')

spss.Submit("""
GET FILE='%(foopathname)s'.
DATASET NAME file1.
DATASET ACTIVATE file1.
""" %locals())

spss.StartDataStep()
datasetObj = spss.Dataset()
caselist = datasetObj.cases
del caselist[3]
spss.EndDataStep()
从命令行

,它不会删除案例k。获取值的类似代码将正常工作。例如,

print caselist[3]

将打印案例k(当它在数据步骤中时)。我甚至可以更改案例的各个条目的值。但它不会删除案件。有什么想法吗?

我是python和spss的新手,所以可能有一些我没有看到的东西对其他人来说是显而易见的;因此我问这个问题的原因。

2 个答案:

答案 0 :(得分:0)

你的第一段代码对我不起作用。我把它调整如下以使它工作:

BEGIN PROGRAM PYTHON.
import spss
spss.StartDataStep()
datasetObj = spss.Dataset()
del datasetObj.cases[k]
spss.EndDataStep()
END PROGRAM.

请注意,在您的代码中,caselist只是一个列表,包含从SPSS中的datasetObj获取的值。属性.cases属于datasetObj

使用spss.Submit,您还可以使用SPSS命令SELECT IF删除案例(或实际上,不选择它们)。例如,如果您的文件具有名为age的变量(列),其值介于0到100之间,则可以删除年龄低于(SPSS:lt或{{1)的所有案例使用:

<

不要忘记添加一些代码来保存编辑过的文件。

答案 1 :(得分:0)

caselist实际上不是包含数据集值的常规列表。虽然它的接口是列表接口,但它实际上直接与数据集一起工作,因此它不包含值列表。它只访问SPSS端的操作以检索,更改或删除值。最重要的区别是,由于统计数据不会将数据保留在内存中,因此案例列表的大小不受内存限制。

但是,如果您尝试使用
循环遍历案例 范围(spss.GetCaseCount())
并删除一些,循环最终将失败,因为实际的案例计数反映了删除,但循环限制不反映。如果先前的案例已被删除,那么datasetObj.cases [k]可能不是您所期望的。因此,您需要跟踪删除并适当调整限制或k值。

HTH