Scala 如何在Spark数据帧中将字符串值编码为数值
我有一个包含两列的数据框:Scala 如何在Spark数据帧中将字符串值编码为数值,scala,apache-spark,apache-spark-mllib,Scala,Apache Spark,Apache Spark Mllib,我有一个包含两列的数据框: df = Col1 Col2 aaa bbb ccc aaa 我想把字符串值编码成数值。我是这样做的: import org.apache.spark.ml.feature.{OneHotEncoder, StringIndexer} val indexer1 = new StringIndexer() .setInputCol("Col1") .setO
df =
Col1 Col2
aaa bbb
ccc aaa
我想把字符串值编码成数值。我是这样做的:
import org.apache.spark.ml.feature.{OneHotEncoder, StringIndexer}
val indexer1 = new StringIndexer()
.setInputCol("Col1")
.setOutputCol("Col1Index")
.fit(df)
val indexer2 = new StringIndexer()
.setInputCol("Col2")
.setOutputCol("Col2Index")
.fit(df)
val indexed1 = indexer1.transform(df)
val indexed2 = indexer2.transform(df)
val encoder1 = new OneHotEncoder()
.setInputCol("Col1Index")
.setOutputCol("Col1Vec")
val encoder2 = new OneHotEncoder()
.setInputCol("Col2Index")
.setOutputCol("Col2Vec")
val encoded1 = encoder1.transform(indexed1)
encoded1.show()
val encoded2 = encoder2.transform(indexed2)
encoded2.show()
问题是aaa
在两列中以不同的方式编码。
如何对数据帧进行编码以正确编码新数据帧,例如:
df_encoded =
Col1 Col2
1 2
3 1
两列上的单个列
索引器
:
val df = Seq(("aaa", "bbb"), ("ccc", "aaa")).toDF("col1", "col2")
val indexer = new StringIndexer().setInputCol("col").fit(
df.select("col1").toDF("col").union(df.select("col2").toDF("col"))
)
并在每列上应用副本
import org.apache.spark.ml.param.ParamMap
val result = Seq("col1", "col2").foldLeft(df){
(df, col) => indexer
.copy(new ParamMap()
.put(indexer.inputCol, col)
.put(indexer.outputCol, s"${col}_idx"))
.transform(df)
}
result.show
// +----+----+--------+--------+
// |col1|col2|col1_idx|col2_idx|
// +----+----+--------+--------+
// | aaa| bbb| 0.0| 1.0|
// | ccc| aaa| 2.0| 0.0|
// +----+----+--------+--------+
两列上的单个列
索引器
:
val df = Seq(("aaa", "bbb"), ("ccc", "aaa")).toDF("col1", "col2")
val indexer = new StringIndexer().setInputCol("col").fit(
df.select("col1").toDF("col").union(df.select("col2").toDF("col"))
)
并在每列上应用副本
import org.apache.spark.ml.param.ParamMap
val result = Seq("col1", "col2").foldLeft(df){
(df, col) => indexer
.copy(new ParamMap()
.put(indexer.inputCol, col)
.put(indexer.outputCol, s"${col}_idx"))
.transform(df)
}
result.show
// +----+----+--------+--------+
// |col1|col2|col1_idx|col2_idx|
// +----+----+--------+--------+
// | aaa| bbb| 0.0| 1.0|
// | ccc| aaa| 2.0| 0.0|
// +----+----+--------+--------+
您可以让自己进行转换,示例是我的pyspark代码
sindex\u pro=StringIndexer(inputCol='StringCol',outputCol='StringCol\u c',stringOrderType=“frequencyDesc”,handleInvalid=“keep”).fit(省测向)`
从pyspark.sql.functions导入col
从pyspark.ml导入转换器
从pyspark.sql导入数据帧
Si类(变压器):
定义初始化(self、clf、col_name):
super(SelfSI,self)。\uuuu init\uuuuu()
self.clf=clf
self.col\u name=col\u name
def rename_col(自身、df、反向=假):
或_name='StringCol'
col\u name=self.col\u name
如果相反:
df=df.withColumnRename(或列名称、列名称)
或_name=col_name+“_c”
col_name='StringCol_c'
df=df.WithColumnRename(列名称或列名称)
返回df
def_变换(self,df:DataFrame)->DataFrame:
df=自我。重命名_col(df)
df=自循环变换(df)
df=self.rename_col(df,inverse=True)
返回df
pro\u si=SelfSI(sindex\u pro,'pro\u name')
pro_si.transform(df_或)
#或管道
模型=管道(阶段=[pro_-si,pro_-si2])。拟合(df_或)
模型转换(df_或)
#结果像
省|市|省|名|市|名||
+-------------+---------+---------------+-----------+
| 河北| 保定| 23.0| 18.0|
| 河北| 张家| 23.0| 213.0|
| 河北| 承德| 23.0| 126.0|
| 河北| 沧州| 23.0| 6.0|
| 河北| 廊坊| 23.0| 26.0|
| 北京| 北京| 13.0| 107.0|
| 天津| 天津| 10.0| 85.0|
| 河北| 石家| 23.0| 185.0|
您可以让自己进行转换,例如我的Pypark代码
sindex\u pro=StringIndexer(inputCol='StringCol',outputCol='StringCol\u c',stringOrderType=“frequencyDesc”,handleInvalid=“keep”).fit(省测向)`
从pyspark.sql.functions导入col
从pyspark.ml导入转换器
从pyspark.sql导入数据帧
Si类(变压器):
定义初始化(self、clf、col_name):
super(SelfSI,self)。\uuuu init\uuuuu()
self.clf=clf
self.col\u name=col\u name
def rename_col(自身、df、反向=假):
或_name='StringCol'
col\u name=self.col\u name
如果相反:
df=df.withColumnRename(或列名称、列名称)
或_name=col_name+“_c”
col_name='StringCol_c'
df=df.WithColumnRename(列名称或列名称)
返回df
def_变换(self,df:DataFrame)->DataFrame:
df=自我。重命名_col(df)
df=自循环变换(df)
df=self.rename_col(df,inverse=True)
返回df
pro\u si=SelfSI(sindex\u pro,'pro\u name')
pro_si.transform(df_或)
#或管道
模型=管道(阶段=[pro_-si,pro_-si2])。拟合(df_或)
模型转换(df_或)
#结果像
省|市|省|名|市|名||
+-------------+---------+---------------+-----------+
| 河北| 保定| 23.0| 18.0|
| 河北| 张家| 23.0| 213.0|
| 河北| 承德| 23.0| 126.0|
| 河北| 沧州| 23.0| 6.0|
| 河北| 廊坊| 23.0| 26.0|
| 北京| 北京| 13.0| 107.0|
| 天津| 天津| 10.0| 85.0|
| 河北| 石家| 23.0| 185.0|
如何解码col1_idx
和col2_idx
返回原始df
值?如何解码col1_idx
和col2_idx
返回原始df
值?