我有一个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|
+----------------+------+-----+-----+
答案 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)