如何在 Pyspark 中将分类数据转换为数值数据

数据挖掘 Python 阿帕奇火花 分类数据 pyspark
2021-10-11 02:15:36

我正在使用 Ipython notebook 来处理 pyspark 应用程序。我有一个包含大量分类列的 CSV 文件,以确定收入是低于还是高于 50k 范围。我想执行一个分类算法,采用所有输入来确定收入范围。我需要为映射变量构建一个变量字典,并使用映射函数将变量映射到数字以进行处理。本质上,我希望我的数据集采用数字格式,以便我可以着手实现模型。

在数据集中,有分类列,如教育、婚姻状况、工人阶级等。有人能告诉我如何将它们转换为 pyspark 中的数字列吗?

workclass = {'?':0,'Federal-gov':1,'Local-gov':2,'Never-  worked':3,'Private':4,'Self-emp-inc':5,'Self-emp-not-inc':6,'State-gov':7,'Without-pay':8}

我为工作类创建了一个带有键值对的示例字典。但是,我不知道如何在 map 函数中使用它并将 CSV 文件中的分类数据替换为相应的值。

wc = pd.read_csv('PATH', usecols = ['Workclass'])

df = pd.DataFrame(wc)
wcdict = {' ?':0,' Federal-gov':1,' Local-gov':2,' Never-worked':3,' Private':4,' Self-emp-inc':5,' Self-emp-n-inc':6,' State-gov':7,' Without-pay':8}
df_new = df.applymap(lambda s: wcdict.get(s) if s in wcdict else s)
print(df_new)

这是我用普通 python 编写的将分类数据转换为数值数据的代码。它工作正常。我想在火花上下文中进行转换。并且,数据源中有 9 个分类列。有没有办法自动化字典更新过程,让所有 9 列都有一个 KV 对?

3个回答

这可以StringIndexer在 PySpark 中使用,反向使用IndexToString以供参考,请检查:

from pyspark.ml.feature import StringIndexer

df = sqlContext.createDataFrame(
    [(0, "a"), (1, "b"), (2, "c"), (3, "a"), (4, "a"), (5, "c")],
    ["id", "category"])
indexer = StringIndexer(inputCol="category", outputCol="categoryIndex")
indexed = indexer.fit(df).transform(df)
indexed.show()

有关更多详细信息,请查看spark 文档

workclass = {'?':0,'Federal-gov':1,'Local-gov':2,'Never-  worked':3,'Private':4,'Self-emp-inc':5,'Self-emp-not-inc':6,'State-gov':7,'Without-pay':8}

尝试定义一个返回键的映射器函数:

def mapr(dict_key):
    return workclass[dict_key]

print list(map(mapr,workclass))

这可以工作。假设如果您的列名是“婚姻状况”并且是分类的,

v1=dataset['Marital status'].unique()

dataset['Marital status'].replace(to_replace=v1,value= list(range(len(v1))), inplace=True)