3

Ich habe eine kategorische Spalte in einem Datenrahmen, die einige Ebenen hat, und jetzt möchte ich jene weniger häufigen Ebenen ersetzen (die Frequenzen in Prozent von insgesamt weniger als a haben angegebener Prozentsatz) mit der häufigsten Stufe. Wie würde ich das auf elegante und kompakte Weise erkennen?PySpark ersetzt seltenere Elemente durch die am häufigsten vorkommenden Elemente

Unten ist ein Beispiel, wenn ich die spezifizierte Frequenz als 0.3 setze, dann sollte Niveau "c" durch Niveau "a" ersetzt werden, da seine Frequenz nur 1/6 ist, die unter 0.3 ist.

from pyspark.sql import Row 

row = Row("foo") 

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

Antwort

0

Hoffe, das hilft!

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

Ausgang ist:

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

@Wayne Vielleicht sollten Sie [akzeptieren die Antwort] (https://stackoverflow.com/help/someone-answers), wenn es Ihnen geholfen, Ihr Problem zu lösen. – Prem

+0

Danke Prem, es funktioniert! – Wayne

+0

Froh, dass es geholfen hat :) – Prem

Verwandte Themen