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

在PySpark中为基于行的操作添加列

谭伟
2023-03-14

我有一个Spark DataFrame,我正在尝试基于以前的列创建一个新列,但对我来说,困难的是我已经按行计算了列的值。例如:

列1 |列2 |列3

1 | 2 | 3

4|5|0

3 | 1 | 1

因此,我想要一个新列,每行具有表达式
max(col1, col2, col3)的列名。所以,所需的输出:

Col1 |Col2 |Col3 |Col4

1|2|3|'col3'

4|5|0|'col2'

3|1|1|'col1'

总之在PySpark是可能做到的?

共有1个答案

马胜泫
2023-03-14

这不是一个理想的答案,因为它迫使你回到RDD。如果我找到了一个更好的方法,让你留在DataFrame宇宙中,我会更新我的答案。但目前这应该奏效。

a = sc.parallelize([[1,2,3],[4,5,0],[3,1,1]])
headers = ["col1", "col2", "col3"]

b = a.map(lambda x: (x[0], x[1], x[2], headers[x.index(max(x))]))

b.toDF(headers.append("max_col")).show()

这基本上允许您通过逐行迭代RDD来使用python中的< code>max操作。然后,它通过索引标题列表找到正确的列。

再次,我不确定这是最好的方法,我希望找到更好的方法。

 类似资料:
  • 如果有一个数据帧,并希望根据行的值对函数中的数据进行一些操作。 有谁知道如何将我的udf应用于数据帧?

  • 我有一个这样的数据帧: 现在,我需要创建新的列“col3”,并且我必须根据col1值在col3中放入新值。生成的数据框如下所示。 比如,如果col1的值为“a”,那么col3中应该有“apple”。如果col1的值为“b”,那么col3中应该有“banana”。如果col1的值为“c”,那么col3中应该有“custard”。 注:col2为正常列,请不要考虑。 我可以得到任何PYSpark UD

  • 我用的是PySpark,我有一个Spark数据框架,里面有一堆数字列。我想添加一列,它是所有其他列的总和。 假设我的数据帧具有列“a”、“b”和“c”。我知道我能做到: 问题是,我不想单独键入每列并添加它们,尤其是如果我有很多列。我希望能够自动执行此操作,或者通过指定要添加的列名列表来执行此操作。有其他方法吗?

  • 我有一个多标签谷歌表。第一个是主表,我有一些基本的位置信息。在其他页面中,我通过“导入”传输这些基本信息,因此我有一些列动态更改,一些是静态的,用户可以更新。尽管如此,如果我在主工作表的数据之间添加一行,它只会更改动态列(从importrange更新),而其余列不会更改-这会影响更新。在主工作表中添加行时,是否有任何方法/脚本可以自动在其他工作表中添加行?

  • 问题内容: 如果我只想向集合中添加单个值,则python中的添加和更新操作之间有什么区别? 有人可以解释为什么会这样。 问题答案: 向集合中添加单个元素。所以, 可以,但是除非可哈希,否则它不能与可迭代对象一起使用。这就是失败的原因。 在这里,将其视为要添加到集合中的元素,并且如错误消息所言,列表不能被散列,但是集合中的所有元素都应该是可散列的。引用文档, 返回一个新的或对象,其元素来自可迭代。集

  • 这篇文章给出了一个关于如何更改列名的很好的概述。如何在PySpark中更改dataframe列名? 不过,我需要一些更多的/稍微调整,我没有能力做。有人能帮我删除所有colnames中的空格吗?它需要例如连接命令,系统方法减少了处理30列的工作量。我认为regex和UDF的组合最好。 示例:root--客户机:string(nullable=true)--分支号:string(nullable=t