【问题标题】:PySpark - Is there a way to iterate over multiple columns and fill NAs with the column's max number(+1)?PySpark - 有没有办法遍历多列并用列的最大数(+1)填充 NA?
【发布时间】:2019-12-27 06:17:22
【问题描述】:

我有一个 PySpark 数据框,在多列中包含 Null。我正在尝试用相应列的最大数 + 1 填充空值。想法是在一次热编码后返回并将这些值标记为“无”,以在创建“缺失”时尝试模仿 SAS 中的一个热编码过程" 每个数字分类列的类别。

例如,男性中的'null'应该是'3'。所以,男性列的最大数量 + 1 = 3。然后是 4,其他列是 6。

示例数据:

+----------------+------+-----+-----+
|              MS|  male| rate|level|
+----------------+------+-----+-----+-
|         Married|  null| null|    5|
|         Married|     1|    2|    2|
|        Divorced|     2|    3| null|
+----------------+------+-----+-----+

这是迄今为止我尝试过的一些方法。但它要么不填充空值,要么将“6”填充到所有列中。

null_list = ['male', 'rate', 'level']
descr_dict = {'male': '2', 'rate': '3', 'level': '5'}

for c in spark_data.columns:
    if c in null_list:
        for key, value in descr_dict.items():
            max_val = int(value) + 1
            df = spark_data.withColumn(c, F.when((spark_data[c]==key) & 
                 (spark_data[c].isNull())), 
                  F.lit(max_val)).otherwise(spark_data[c]))

预期数据:

+----------------+------+-----+-----+
|              MS|  male| rate|level|
+----------------+------+-----+-----+-
|         Married|     3|    4|    5|
|         Married|     1|    2|    2|
|        Divorced|     2|    3|    6|
+----------------+------+-----+-----+

【问题讨论】:

    标签: python loops dataframe pyspark null


    【解决方案1】:

    您可以像以前一样遍历DataFrame 的列,然后计算该列的最大值。

    import pyspark.sql.functions as func
    from pyspark.sql.window import Window as wd
    
    for colnm in sdf.schema.names:
        if colnm.lower() not in ['ms']:
            sdf = sdf. \
                withColumn(colnm, 
                           func.when(func.col(colnm).isNull(), func.max(colnm).over(wd.partitionBy(func.lit(1))) + func.lit(1)).
                           otherwise(func.col(colnm))
                           )
    

    这与您的想法相似。只计算那里的最大值。

    【讨论】:

      【解决方案2】:

      DataFrame.fillna 接受可以包含您想要填充的键的字典。 例如

      fill_values = {
        k: int(v) + 1
        for k, v in descr_dict.items()
      }
      sdf = sdf.na.fill(fill_values)
      

      【讨论】:

        猜你喜欢
        • 2021-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-07-17
        • 2021-03-23
        • 1970-01-01
        相关资源
        最近更新 更多