3

データフレーム内にいくつかのレベルを持つカテゴリの列があります。これらの頻度の低いレベルを置き換えたいと思います。指定されたパーセンテージ)を最も頻繁に使用します。どのように私はエレガントでコンパクトな方法でそれを実現するだろうか?PySparkは、頻度の低いアイテムを最も頻繁なアイテムに置き換えます。

以下の例では、指定した頻度を0.3と設定した場合、レベル「c」は頻度が0.3以下の1/6なのでレベル「a」に置き換えてください。

from pyspark.sql import Row 

row = Row("foo") 

df = sc.parallelize([ row("a"), row("b"), row("c"), row("a"), row("a"), row("b") ]).toDF() 

答えて

0

from pyspark.sql import Row 
import pyspark.sql.functions as f 

#sample data 
row = Row("foo") 
df = sc.parallelize([ row("a"), row("b"), row("c"), row("a"), row("a"), row("b") ]).toDF() 

df_temp = df.groupBy('foo').agg((f.count(f.lit(1))/df.count()).alias("frequency")) 
most_frequent_foo = df_temp.sort(f.col('frequency').desc()).select('foo').first()[0] 
df_temp = df_temp.withColumn('foo_replaced', 
          f.when(f.col("frequency") < 0.3, f.lit(most_frequent_foo)).otherwise(f.col('foo'))) 

df_final = df.join(df_temp, df.foo==df_temp.foo, 'left').drop(df_temp.foo).drop("frequency") 
df_final.show() 

出力は次のようになります。それはあなたがあなたの問題を解決する助けた場合

+---+------------+ 
|foo|foo_replaced| 
+---+------------+ 
| c|   a| 
| b|   b| 
| b|   b| 
| a|   a| 
| a|   a| 
| a|   a| 
+---+------------+ 
+0

@Wayneたぶん、あなたは(https://stackoverflow.com/help/someone-answers)[答えを受け入れる]すべきです。 – Prem

+0

プレミアムありがとう、それは動作します! – Wayne

+0

助けてくれてうれしいです:) – Prem

関連する問題