在PySpark数据框中填充非空值作为1

时间:2018-07-17 12:09:58

标签: python apache-spark pyspark apache-spark-sql

我有一个名为dataframe_freq的pyspark数据帧,如下所示,

+-----------+----+----+----+----+---+----+
|customer_id|  p1|  p2|  p3|  p4| p5|  p6|
+-----------+----+----+----+----+---+----+
|       null|null| 0.6|   0| 0.4|  0| 0.6|
|          2|   0|null| 0.4|null|0.4|   0|
|       null| 0.5|   0|null|   0|  0| 0.5|
|          4| 0.3|null|   0|   0|  0|null|
|          5| 0.4|null|   0|null|0.4| 0.2|
+-----------+----+----+----+----+---+----+

如果我想替换可以使用的空值,

dataframe_freq = dataframe_freq.na.fill('1')

但是我想将非空值替换为1。所以我的结果数据框应该是

+-----------+----+----+----+----+---+----+
|customer_id|  p1|  p2|  p3|  p4| p5|  p6|
+-----------+----+----+----+----+---+----+
|       null|null|   1|   1|   1|  1|   1|
|          1|   1|null|   1|null|  1|   1|
|       null|   1|   1|null|   1|  1|   1|
|          1|   1|null|   1|   1|  1|null|
|          1|   1|null|   1|null|  1|   1|
+-----------+----+----+----+----+---+----+

任何人都可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

您可以尝试以下操作:

import pyspark.sql.functions as F
import pandas as pd

# Sample data
df = pd.DataFrame({'x1': [None, '1', None],
                   'x2': ['b', None, '2'],
                   'x3': [None, '0', '3'] })
df = spark.createDataFrame(df)

for c in df.columns:
    df = df.withColumn(c,F.when(F.col(c).isNull(),F.col(c)).otherwise(F.lit(1)))

df.show()

之前:

+----+----+----+
|  x1|  x2|  x3|
+----+----+----+
|null|   b|null|
|   1|null|   0|
|null|   2|   3|
+----+----+----+

之后:

+----+----+----+
|  x1|  x2|  x3|
+----+----+----+
|null|   1|null|
|   1|null|   1|
|null|   1|   1|
+----+----+----+

希望这会有所帮助!

答案 1 :(得分:1)

@Florian答案的另一种解决方案是使用理解列表。我正在使用相同的数据示例:

import pyspark.sql.functions as F
import pandas as pd

# Sample data
df = pd.DataFrame({'x1': [None, '1', None],
                   'x2': ['b', None, '2'],
                   'x3': [None, '0', '3'] })
df = spark.createDataFrame(df)

selection = [F.when(F.col(c).isNull(),F.col(c)).otherwise(F.lit(1)).alias(c) for c in df.columns]

df.select(selection).show()
# +----+----+----+
# |  x1|  x2|  x3|
# +----+----+----+
# |null|   1|null|
# |   1|null|   1|
# |null|   1|   1|
# +----+----+----+

您只需要注意,两种解决方案都有相同的优化逻辑计划。