PySpark : 将DataFrame中字符串类型的列转换为Double类型时出现KeyError

我在学习使用PySpark进行机器学习。我有一个数据集,其中包含几个String类型的列,这些列的值可能是True或False或Yes或No。我正在使用DecisionTree,我想将这些String值转换为相应的Double值,即True, Yes应更改为1.0,而False, No应更改为0.0。我看到一个教程中做了同样的事情,于是我写了如下代码

df = sqlContext.read.csv("C:/../churn-bigml-20.csv",inferSchema=True,header=True)from pyspark.sql.types import DoubleTypefrom pyspark.sql.functions import UserDefinedFunctionbinary_map = {'Yes':1.0, 'No':0.0, 'True':1.0, 'False':0.0}toNum = UserDefinedFunction(lambda k: binary_map[k], DoubleType())csv_data = df.drop('State').drop('Area code') \    .withColumn('Churn', toNum(df['Churn'])) \    .withColumn('International plan', toNum(df['International plan'])) \    .withColumn('Voice mail plan', toNum(df['Voice mail plan'])).cache()

然而,当我运行这段代码时,出现了很多这样的错误。

  File "C:\..\spark-2.1.0\python\lib\pyspark.zip\pyspark\worker.py", line 70, in <lambda>  File "C:\..\workspace\PyML\src\ModelBuilding.py", line 20, in <lambda>    toNum = UserDefinedFunction(lambda k: binary_map[k], DoubleType())KeyError: False

注意:我使用的是Spark 2.1和Python 3.5进行PySpark开发,而我所参考的教程使用的是Spark 1.6和Python 2.7。所以我不知道这是否是Python语法问题之一。


回答:

我通过更改映射部分解决了这个问题:

binary_map = {'Yes':1.0, 'No':0.0, True : 1.0, False : 0.0}toNum = UserDefinedFunction(lambda k: binary_map[k], DoubleType())

我只是去掉了True和False的引号。我觉得这有点奇怪,但当我使用print(df.printSchema())检查DataFrame的模式时,它显示包含True和False值的字段是boolean类型。

模式

root |-- State: string (nullable = true) |-- Account length: integer (nullable = true) |-- Area code: integer (nullable = true) |-- International plan: string (nullable = true) |-- Voice mail plan: string (nullable = true)  .  .  . |-- Customer service calls: integer (nullable = true) |-- Churn: boolean (nullable = true)

所以这就是为什么我必须去掉引号。谢谢。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注