2017-08-25 7 views
0

インデクサーをpysparkに適用することはできますが、カテゴリはアルファベット順に並べ替えることができますか?StringIndexer 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になりたい、それが

C、A、Bだった場合、私は= 0、B = 1、C = 2、などをしたいと思います...

+0

StringIndexerはラベル頻度に基づいて列ラベルにインデックスを提供します。あなたのケースでは、それを行うカスタムトランスフォーマをコーディングする必要があるかもしれないと考えてください。 – Suresh

+0

あなたのユースケースはわかりませんが、インデックス付きの列を辞書に保存し、それをMLパイプラインに使用しない場合は、列を並べて密度の高いランクを実行します。これはあなたを助けるかもしれません。 – Suresh

答えて

0

spark 2.3.0では、sparkのStringIndexerはstringOrderTypeパラメータ(related jira issue)を取得しますが、< 2.3.0ではカスタムトランスフォーマを作成する必要があります。たとえば、あなたは、すべての値をゲータインデックスを追加し、最初のDFで参加し、このようにすることができます:あなたが作成した変圧器の辞書を持っていることについて気にしない場合@Sureshがに気づいたよう

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、あなただけdense_rankを使用することができますコメント:

df.withColumn('col2Index', dense_rank().over(Window.orderBy('col2')) - 1).show() 
関連する問題