如何在pyspark Dataframe 中用0替换负值

chhkpiq4  于 2023-04-29  发布在  Spark
关注(0)|答案(3)|浏览(135)

我想在pyspark Dataframe 中用0替换所有负数,用0替换所有nan值。我尽力了

df[df < 0] = 0

但是出错了。

kb5ga3dv

kb5ga3dv1#

您可以使用reducewhen的组合来执行此操作-
to_convert-包含要转换为0的列列表

数据准备

input_str = """
|-1|100
|10|-10
|200|-300
|-500|300
""".split("|")

input_values = list(map(lambda x: int(x.strip()), input_str[1:]))

input_list = [(x, y) for x, y in zip(input_values[0::2], input_values[1::2])]

sparkDF = sql.createDataFrame(input_list, ["a", "b"])

sparkDF.show()
+----+----+
|   a|   b|
+----+----+
|  -1| 100|
|  10| -10|
| 200|-300|
|-500| 300|
+----+----+

Reduce和When

to_convert = set(['a'])

sparkDF = reduce(
    lambda df, x: df.withColumn(x, F.when(F.col(x) < 0, 0).otherwise(F.col(x))),
    to_convert,
    sparkDF,
)

sparkDF.show()
+---+----+
|  a|   b|
+---+----+
|  0| 100|
| 10| -10|
|200|-300|
|  0| 300|
+---+----+
siotufzp

siotufzp2#

您可以将所有df列中的空值替换为0(或您选择的任何值)。fillna(0)方法。然而,要在列之间替换负值,我没有任何直接的方法,除了在每个列上使用case,如下所示。

from pyspark.sql import functions as F

df.withColumn(
    "col1",
    F.when(df["col1"] < 0, 0).when(F.col("col1").isNull(), 0).otherwise(F.col("col1")),
)
eufgjt7s

eufgjt7s3#

df.withColumn("col1",greatest(col("col1"), lit(0))

相关问题