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


11

我正在使用Ipython Notebook与pyspark应用程序一起使用。我有一个包含大量分类列的CSV文件,以确定收入是否低于或超过50k。我想使用所有输入来执行分类算法,以确定收入范围。我需要建立一个将变量映射到变量的字典,并使用map函数将变量映射到数字以进行处理。本质上,我会将数据集设置为数字格式,以便我可以实施模型。

在数据集中,有分类列,例如教育,婚姻状况,工人阶级等。有人可以告诉我如何将它们转换为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}

我创建了一个示例字典,其中包含工作类的键值对。但是,我不知道如何在地图功能中使用此功能,并将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编写的代码,用于将分类数据转换为数值数据。它工作正常。我想在Spark上下文中进行转换。并且,数据源中有9个类别列。有没有一种方法可以自动执行字典更新过程,以使所有9列都有一个KV对?

Answers:


14

这可以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文档


2
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))

嘿,您能告诉我这个方块做什么吗?我运行添加了此代码的脚本,并得到了[6,1,4,3,5,7,7,8,0,2]作为输出。我想使用字典中的值将数字值替换为工作类内容。
SRS 2015年

嗨,Mapr函数将返回与类别值关联的数值。例如:'Self-emp-not-inc'为6,python字典是无序的。如果需要有序字典,请尝试collections.OrderedDict。
Sreejithc321

好的,现在我了解了该功能。关键是,我有一个包含数千行的CSV,并且有一个名为Workclass的列,其中包含字典中提到的任何值。因此,对于每一行,我需要通过将文本与字典进行比较并替换相应的数字,将该列中的文本更改为数字。如何使用函数按行分析列并将值与字典进行比较?
SRS

您可以创建一个附加列,例如“ workclass_num”,该列存储与分类值相对应的数值。检查Python Pandas库。
Sreejithc321
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.