Python 3.x 如何为具有真、假和空值的布尔字段创建分层采样?
我有一个带有布尔字段的数据框Python 3.x 如何为具有真、假和空值的布尔字段创建分层采样?,python-3.x,pyspark,sample,Python 3.x,Pyspark,Sample,我有一个带有布尔字段的数据框 df = spark.createDataFrame([ [True], [False], [None], [True], [False], [None] ]).toDF("match") 我想创建一个具有相同真、假和空值的分层样本(PySpark) 如何在我的示例中也获取空值(None:0.3不被接受) 基于ofsampleBy方法,参数sections是一个Map[T,Double],对于带有Spa
df = spark.createDataFrame([
[True],
[False],
[None],
[True],
[False],
[None]
]).toDF("match")
我想创建一个具有相同真、假和空值的分层样本(PySpark)
如何在我的示例中也获取空值(None:0.3
不被接受)
基于ofsampleBy
方法,参数sections
是一个Map[T,Double]
,对于带有Spark的MapType列,不允许使用空键(请参阅)
一种可能的解决方案是添加一个标志,将False
、True
和NULL
转换为0
、1
、2
,然后基于该标志进行采样,例如:
from pyspark.sql.functions import expr
df_sample = df.withColumn('flag', expr("coalesce(int(match), 2)")) \
.sampleBy("flag", {0:0.3, 1:0.3, 2:0.3}) \
.drop("flag")
非常感谢。很好的解决方案。如果您将此作为答案添加,我可以接受(并且您还可以获得赏金积分;-))
def sampleBy[T](col: String, fractions: Map[T, Double], seed: Long): DataFrame = {
sampleBy(Column(col), fractions, seed)
}
from pyspark.sql.functions import expr
df_sample = df.withColumn('flag', expr("coalesce(int(match), 2)")) \
.sampleBy("flag", {0:0.3, 1:0.3, 2:0.3}) \
.drop("flag")