应用StringIndexer PySpark数据帧,但按字母顺序排列
如何在pyspark中应用索引器,但按字母顺序排列类别 在应用Stringindexer之后,我有了索引值的字典,但我想以不同的顺序排列它应用StringIndexer PySpark数据帧,但按字母顺序排列,pyspark,Pyspark,如何在pyspark中应用索引器,但按字母顺序排列类别 在应用Stringindexer之后,我有了索引值的字典,但我想以不同的顺序排列它 index_df = StringIndexer(inputCol="gender", outputCol="genderIndex") meta = [f.metadata for f in index_df.schema.fields if f.name == "genderIndex"] meta [{u'ml_attr': {u'name': u'
index_df = StringIndexer(inputCol="gender", outputCol="genderIndex")
meta = [f.metadata for f in index_df.schema.fields if f.name == "genderIndex"]
meta
[{u'ml_attr': {u'name': u'genderIndex',
u'type': u'nominal',
u'vals': [u'Male', u'Female']}}]
a=dict(enumerate(meta[0]["ml_attr"]["vals"]))
a=
{0: u'Male', 1: u'Female'}
但举个例子,我希望女性是0,如果是a,b,c
我想要a=0、b=1、c=2等等。在spark 2.3.0中,spark的StringIndexer将获得
stringOrderType
参数(),但在中,spark 2.3.0中,spark的StringIndexer将获得stringOrderType
参数(),但在StringIndexer中,将根据标签频率为列标签提供索引。对于您的情况,我想我们可能需要编写自定义transformer来完成这项工作。我不知道您的用例,但是如果您要将索引列保存到dictionary,而不是将其用于ML管道,那么请对该列进行排序并进行密集排序。这可能会对您有所帮助。StringIndexer根据标签频率为列标签提供索引。对于您的情况,我想我们可能需要编写自定义transformer来完成这项工作。我不知道您的用例,但是如果您要将索引列保存到dictionary,而不是将其用于ML管道,那么请对该列进行排序并进行密集排序。这可能对你有帮助。
from pyspark.sql.window import Window
df = spark.createDataFrame([(10, 'b'), (20, 'b'), (30, 'c'),
(40, 'c'), (50, 'c'), (60, 'a')], ['col1', 'col2'])
col2_index = df.select('col2').distinct() \
.withColumn('col2Index', row_number().over(Window.orderBy('col2')) - 1)
col2_index.show()
+----+---------+
|col2|col2Index|
+----+---------+
| a| 0|
| b| 1|
| c| 2|
+----+---------+
df.join(col2_index, 'col2').show()
+----+----+---------+
|col2|col1|col2Index|
+----+----+---------+
| c| 30| 2|
| c| 40| 2|
| c| 50| 2|
| b| 10| 1|
| b| 20| 1|
| a| 60| 0|
+----+----+---------+
df.withColumn('col2Index', dense_rank().over(Window.orderBy('col2')) - 1).show()