我有一个名为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|
+-----------+----+----+----+----+---+----+
任何人都可以帮忙吗?
答案 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|
# +----+----+----+
您只需要注意,两种解决方案都有相同的优化逻辑计划。