当前位置: 首页 > 知识库问答 >
问题:

如何在pyspark中创建一个包含所有大于0的行值的新列?

鲜于凯歌
2023-03-14

假设我有一个pyspark数据帧:

col1 col2  col3
1     2    -3
2     null  5
4     4     8
1     0     9

我想添加一个名为check的列,它计算大于0的值的数量。

最终输出将是:

col1 col2  col3     check
    1     2    -3    2
    2     null  5    2
    4     4     8    3
    1     0     9    2

我正在尝试这个。但是,它没有帮助,错误如下:

df= df.withColumn("check", sum((df[col] > 0) for col in df.columns))

参数无效,不是字符串或列:

共有3个答案

周通
2023-03-14
匿名用户

您可以使用<code>函数工具。减少以对df中的列列表求和。列if

from pyspark.sql import functions as F
from operator import add
from functools import reduce


df = spark.createDataFrame([
    (1, 2, -3), (2, None, 5), (4, 4, 8), (1, 0, 9)
], ["col1", "col2", "col3"])

df = df.withColumn(
    "check",
    reduce(add, [F.when(F.col(c) > 0, 1).otherwise(0) for c in df.columns])
)

df.show()
#+----+----+----+-----+
#|col1|col2|col3|check|
#+----+----+----+-----+
#|   1|   2|  -3|    2|
#|   2|null|   5|    2|
#|   4|   4|   8|    3|
#|   1|   0|   9|    2|
#+----+----+----+-----+

阳长恨
2023-03-14

创建新列数组过滤器新创建的列最后对列中的元素进行计数。

示例:

df.show(10,False)
#+----+----+----+
#|col1|col2|col3|
#+----+----+----+
#|1   |2   |-3  |
#|2   |null|5   |
#+----+----+----+

df.withColumn("check",expr("size(filter(array(col1,col2), x -> x > 0))")).show(10,False)
#+----+----+----+-----+
#|col1|col2|col3|check|
#+----+----+----+-----+
#|1   |2   |-3  |2    |
#|2   |null|5   |1    |
#+----+----+----+-----+
白泽语
2023-03-14

我不知道是否有更简单的基于SQL的解决方案,但它非常简单。

count_udf = udf(lambda arr: sum([1 for a in arr if a > 0]), IntegerType())
df.withColumn('check', count_udf(array('col1', 'col2', 'col3'))).show()

不确定它是否会处理空值。添加空检查(如果a和a

理念: https://stackoverflow.com/a/42540401/496289

您的代码显示您对非零列进行求和,而不是计数。如果您需要求和,那么

count_udf = udf(lambda arr: sum([a for a in arr if a > 0]), IntegerType())

 类似资料:
  • 我有一个包含以下[('列1',值),('列2',值),('列3',值),…,('列100',值)]的RDD。我想创建一个包含带有元组的单个列的数据框。 我得到的最接近的是: 然后 但这会产生一个包含列表列的数据帧,而不是元组。

  • 我正在尝试创建一个jar文件,其中包含所有的依赖jar文件。Maven创建了一个单独的lib文件夹,并将所有的jar复制到其中,然后可执行jar就会工作,因为jar和lib位于同一位置,但我希望jar是主jar的一部分,而不是在lib文件夹中。我该怎么做?

  • 编写一个程序,返回一个新数组,该数组包含所有大于数组中第一个值的值。如果数组中没有大于第一个值的值,则返回空数组。如果数组为空,则返回一个空数组。 我这样解决这个问题: 谢谢

  • 假设我已经将NVIDIA NGC PyTorch docker图像拉到如下位置: 然后我想添加这些python包:? 此外,如何在整个组织中分发新映像?

  • 这个问题与这个问题有关-但是,由于弃用而支持,它不起作用。它确实拾取了用声明的依赖项。然而,由于它被弃用,使用它不是一个选项(无论如何,当它被删除时,我们会回到这里) 我有一个Gradle任务: 除了测试依赖之外,还有一个依赖项: 从IDE运行很好。然而,当我部署到Raspberry Pi(或在本地使用jar结果)时,我会遇到以下异常: 由以下行触发: 在静态编程语言方法中,返回

  • 我成功创建了一个包含1个键和2个值的查找表: 但当我试图将其扩展到4个值时,我发现了一系列错误,我发现条目仅限于2个值! 那么,请,如何对1个键和4个值做类似的事情?我不能通过为第一个映射的第二个参数声明内部map.entry来扩展它。条目,因为在这一点上,第一个字符串不再是唯一的,我是说,映射的所有参数。条目 你们不需要走我走的路。你们可以自由地提供任何解决方案/数据结构,允许我存储和检索3个字