我想在pyspark Dataframe 中用0替换所有负数,用0替换所有nan值。我尽力了
df[df < 0] = 0
但是出错了。
kb5ga3dv1#
您可以使用reduce和when的组合来执行此操作-to_convert-包含要转换为0的列列表
to_convert
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| +----+----+
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| +---+----+
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")), )
eufgjt7s3#
df.withColumn("col1",greatest(col("col1"), lit(0))
3条答案
按热度按时间kb5ga3dv1#
您可以使用reduce和when的组合来执行此操作-
to_convert
-包含要转换为0的列列表数据准备
Reduce和When
siotufzp2#
您可以将所有df列中的空值替换为0(或您选择的任何值)。fillna(0)方法。然而,要在列之间替换负值,我没有任何直接的方法,除了在每个列上使用case,如下所示。
eufgjt7s3#