我有一个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是可能做到的?
这不是一个理想的答案,因为它迫使你回到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