应用StringIndexer PySpark Dataframe,但按字母顺序排序

时间:2017-08-25 13:56:08

标签: 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'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等等......

1 个答案:

答案 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()