PySpark-有没有办法遍历多列并用列的最大数(+1)填充NA?

时间:2019-08-22 00:18:53

标签: python loops dataframe pyspark null

我有一个PySpark数据帧,其中Nulls多列。我正在尝试用相应列的最大数+ 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|
+----------------+------+-----+-----+

2 个答案:

答案 0 :(得分:0)

您可以像以前一样遍历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))
                       )

这类似于您的想法。只是自己计算最大值。

答案 1 :(得分:0)

DataFrame.fillna接受一个词典,该词典可以包含您要填充的键。 例如

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