SPSS:使用 Python 编辑值标签

作者:Ruben Geert van den Berg,归属于 SPSS Python 基础

一家本地超市进行了一项小型调查,其数据位于 minisurvey.sav 文件中。不幸的是,用于将数据下载为 SPSS 格式的软件在所有变量和值标签前都添加了变量名称作为前缀。下面的截图显示了部分数据。

SPSS Python 批量更改值标签

值标签中不需要的前缀

在变量视图(Variable View)中点击一些值标签,确认它们确实有不需要的前缀,如下图所示。显然,我们不希望在输出中看到这些值标签,但我们也不想手动调整所有这些标签。幸运的是,SPSS 与 Python 允许我们仅用几行代码解决这个问题

SPSS 移除值标签前缀

使用 Python 移除字符

首先,您需要正确安装 SPSS Python Essentials 才能运行本教程的语法。我们将首先创建一个字符串,其中只包含一个值标签。我们将通过在 Python 中提取子字符串来调整它。准确地说,我们想要提取第 9 个字符到最后一个字符之间的内容。由于 Python 从 0 开始计数,因此 valLab[8:] 正好可以实现这一点。

# Python 子字符串提取第 9 个字符到最后一个字符
begin program python3.
valLab = 'v13_2A: Neutral'
print(valLab[8:])
end program.

查找标签中的冒号

不幸的是,我们的前缀长度不同,所以我们不能仅仅提取第 9 个字符到最后一个字符。但是,我们_确实_看到前缀总是以冒号和一个空格结尾。使用 find 可以找到(第一个)冒号的位置,它会告诉我们提取哪些字符。

# 查找(第一次出现的)": "
begin program python3.
print(valLab.find(": "))
end program.

修复一个值标签

我们的冒号和空格出现在位置 6。因为我们希望标签从这两个字符_之后_开始,所以我们将再加 2,如下所示。简而言之,valLab[valLab.find(": ") + 2:] 总是返回所需的值标签。

# 从 1 个值标签中删除前缀
begin program python3.
valLab = 'v1: Neutral'
print(valLab[valLab.find(": ") + 2:])
end program.

结果

SPSS Python 子字符串值标签

查找 SPSS 字典信息

我们可以使用 Python 的 spss 模块轻松查找 SPSS 字典信息。一些例子是:

  • spss.GetVariableName(ind)
  • spss.GetVariableLabel(ind)
  • spss.GetVariableType(ind)
  • spss.GetVariableFormat(ind)

其中 ind 是 Python 变量索引(0 表示第一个变量,1 表示第二个变量,依此类推)。但是,对于值标签,我们更喜欢使用 spssaux 模块中的 VariableDict()。但我们先来查找所有的变量名。

# 使用 spssaux.VariableDict() 检查变量信息
begin program python3.
import spssaux
sDict = spssaux.VariableDict()
for var in sDict:
    print(var,type(var))
end program.

结果

SPSS Python Vardict Vars

查找值标签

现在我们将查找值标签。对于每个变量,我们将获得一个 Python 字典(Python dict object),其中包含每个带标签的值及其标签。不要混淆 Python 的 dict 对象 与 SPSS 字典(SPSS Dictionary);它们完全不相关。

# 检索值标签(Python dict 对象)
begin program python3.
import spssaux
sDict = spssaux.VariableDict()
for var in sDict:
    valLabs = var.ValueLabels
    print(valLabs)
end program.

结果

SPSS 值标签作为 Python Dict 在输出中

循环遍历值和标签

Python 的 dict 包含键值对(key-value pairs),其中键(key)在 dict 中是唯一的。我们将循环遍历这些键值对,并使用 items() 查找键和值,如下所示。

# 对于每个变量,循环遍历带有标签的值
begin program python3.
import spssaux
sDict = spssaux.VariableDict()
for var in sDict:
    valLabs = var.ValueLabels
    for key,val in valLabs.items():
        print(key,val)
end program.

这里一个主要的混淆点是 SPSS 是我们 Python dict 中的 键(keys)Python dict 值(values) 保存 SPSS 值标签。下图说明了这种映射关系。

SPSS 值标签作为 Python Dict

创建 ADD VALUE LABELS 命令

到目前为止,我们的语法可以找到所有的变量名、值和值标签。将这些插入到 ADD VALUE LABELS 命令中将为整个数据集设置所有的值标签。我们将通过在一个循环中连接这些命令来创建这个语法。注意,\n 在每一行之后添加一个换行符。

# 创建用于调整所有值标签的基本 SPSS 语法
begin program python3.
import spssaux
spssSyntax = ''
sDict = spssaux.VariableDict()
for var in sDict:
    valLabs = var.ValueLabels
    for key,val in valLabs.items():
        spssSyntax += "ADD VALUE LABELS %s %s '%s'.\n"%(var,key,val)
    print(spssSyntax)
end program.

创建用于调整值标签的语法

现在,我们将添加我们之前开发的针对每个值标签的更正。生成的语法_几乎_是我们需要的。如果您在继续阅读之前发现了问题,可以获得奖励。

# 创建用于调整值标签的 SPSS 语法
begin program python3.
import spssaux
spssSyntax = ''
sDict = spssaux.VariableDict()
for var in sDict:
    valLabs = var.ValueLabels
    for key,val in valLabs.items():
        val = val[val.find(": ") + 2:]
        spssSyntax += "ADD VALUE LABELS %s %s '%s'.\n"%(var,key,val)
    print(spssSyntax)
end program.

结果

如果您非常擅长 SPSS,您会看到一些值标签包含单引号。由于标签也包含在单引号中,它们会过早地结束标签。在 Python 中,我们会使用 \' 来转义它们,但这是 SPSS 语法,所以我们需要使用 '' 来代替。

SPSS 使用两个单引号转义单引号

最终语法

现在,我们将用两个单引号替换_值标签内部_的所有单引号。其次,我们将检查我们正在寻找的冒号和空格是否实际存在于每个标签中,如果不存在,我们将跳过它。第三,我们将使用 spss.Submit 运行我们的 SPSS 语法,所以我们需要同时导入 spss 模块和 spssaux 模块。

# 创建并运行最终语法
begin program python3.
import spssaux,spss
spssSyntax = ''
sDict = spssaux.VariableDict()
for var in sDict:
    valLabs = var.ValueLabels
    for key,val in valLabs.items():
        if(": ") in val:
            val = val[val.find(": ") + 2:]
            val = val.replace("'","''")
            spssSyntax += "ADD VALUE LABELS %s %s '%s'.\n"%(var,key,val)
    spss.Submit(spssSyntax)
end program.

# 运行此程序后,我们就完成了。

最终说明

我们的最终语法完成了这项工作:在运行 FREQUENCIES(频率分析)或其他命令时,我们的输出中将有美观、干净的值标签。我相信我们的客户会很欣赏的。

SPSS 输出中干净的值标签

语法可以更短,但它简单易懂。您可以轻松地修改它,用于将值标签大写或从中删除不需要的字符。我希望本教程也展示了如何逐步开发 SPSS Python 语法。

感谢您的阅读!