PySpark 用最频繁的项目替换不太频繁的项目
PySpark replace less frequent items with most frequent items
我在数据框中有一个分类列,它有一些级别,现在我想用最频繁的替换那些频率较低的级别(其频率占总数的百分比小于指定百分比)等级。我如何以一种优雅而紧凑的方式实现这一点?
下面是一个示例,如果我将指定的频率设置为 0.3,那么级别 "c" 应该替换为级别 "a",因为它的频率只有 1/6,低于 0.3。
from pyspark.sql import Row
row = Row("foo")
df = sc.parallelize([ row("a"), row("b"), row("c"), row("a"), row("a"), row("b") ]).toDF()
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.3,那么级别 "c" 应该替换为级别 "a",因为它的频率只有 1/6,低于 0.3。
from pyspark.sql import Row
row = Row("foo")
df = sc.parallelize([ row("a"), row("b"), row("c"), row("a"), row("a"), row("b") ]).toDF()
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|
+---+------------+