PySpark:将 String 类型的 DataFrame 列转换为 Double 时出现 KeyError
PySpark : KeyError when converting a DataFrame column of String type to Double
我正在尝试通过 PySpark
学习机器学习。我有一个数据集,它有几个 String
列,它们的值是 True or False or Yes or 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 DoubleType
from pyspark.sql.functions import UserDefinedFunction
binary_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)
这就是为什么我不得不去掉引号的原因。谢谢。
我正在尝试通过 PySpark
学习机器学习。我有一个数据集,它有几个 String
列,它们的值是 True or False or Yes or 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 DoubleType
from pyspark.sql.functions import UserDefinedFunction
binary_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)
这就是为什么我不得不去掉引号的原因。谢谢。