如何在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'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等等......
答案 0 :(得分:0)
在spark 2.3.0中,spark的StringIndexer将获得stringOrderType
参数(related jira issue),但在< 2.3.0中,您将需要创建自定义变换器。例如,您可以使用初始df来处理所有值,添加索引和连接,如下所示:
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|
+----+----+---------+
OR 如果您不关心创建变换器字典,可以在评论中注意到@Suresh使用dense_rank
:
df.withColumn('col2Index', dense_rank().over(Window.orderBy('col2')) - 1).show()