PySpark如何随机修改DataFrame中指定比例行的State字段值?
随机修改DataFrame中约50%行的State字段
以下代码会将DataFrame所有行的State字段随机替换为state_list中的字符串:
state_list = ['S1', 'S2', 'S3', 'S4'] def random_string(): return random.choice(state_list) def update_df(df): random_string_udf = udf(random_string, StringType()) df = df.withColumn('State', lit(random_string_udf())) df.show() update_df(df)
但实际需求是仅随机修改约50%的行,尝试以下两种方法均未成功:
基于非随机条件修改:
df = df.withColumn('State', when(df.State.like('%ADY%'), lit(random_string_udf())).otherwise(df.State))问题:该方法依赖固定匹配条件,无法实现随机选行修改。
使用
random.randint:df = df.withColumn('State', when(random.randint(0, 1)) == 1), lit(random_string_udf()).otherwise()问题:
when要求传入Column类型的条件,不能直接使用Python原生布尔值。
经调整后,可行的实现方案如下:
df = df.withColumn('State', F.when(F.rand() <= F.lit(0.5), F.shuffle(state_array)[0]).otherwise(df.State))
内容的提问来源于stack exchange,提问作者gary
相关产品推荐
相关产品推荐

