当前位置: 首页 > 面试题库 >

将列总和添加为PySpark数据框中的新列

徐星阑
2023-03-14
问题内容

我正在使用PySpark,并且有一个带有一堆数字列的Spark数据框。我想添加一列,它是所有其他列的总和。

假设我的数据框具有列“ a”,“ b”和“ c”。我知道我可以这样做:

df.withColumn('total_col', df.a + df.b + df.c)

问题是我不想单独键入每列并添加它们,尤其是当我有很多列时。我希望能够自动执行此操作,或者希望通过指定要添加的列名列表来执行此操作。还有另一种方法吗?


问题答案:

这并不明显。我看不到spark Dataframes API中定义的列的基于行的总和。

这可以用相当简单的方式完成:

newdf = df.withColumn('total', sum(df[col] for col in df.columns))

df.columns由pyspark作为字符串列表提供,这些字符串给出了Spark
Dataframe中的所有列名称。对于不同的总和,您可以提供其他任何列名称列表。

我没有尝试将其作为第一个解决方案,因为我不确定它的行为。但这有效。

版本1

这太复杂了,但是也可以。

你可以这样做:

  1. 用于df.columns获取列名称的列表
  2. 使用该名称列表创建列的列表
  3. 将该列表传递给将以折叠类型的函数方式调用列的重载add函数的东西

使用python的reduce,有关运算符重载如何工作的一些知识,以及此处列的pyspark代码变为:

def column_add(a,b):
     return  a.__add__(b)

newdf = df.withColumn('total_col', 
         reduce(column_add, ( df[col] for col in df.columns ) ))

请注意,这是python减少,而不是spark RDD减少,第二个参数reduce中的括号项需要括号,因为它是一个列表生成器表达式。

经过测试,有效!

$ pyspark
>>> df = sc.parallelize([{'a': 1, 'b':2, 'c':3}, {'a':8, 'b':5, 'c':6}, {'a':3, 'b':1, 'c':0}]).toDF().cache()
>>> df
DataFrame[a: bigint, b: bigint, c: bigint]
>>> df.columns
['a', 'b', 'c']
>>> def column_add(a,b):
...     return a.__add__(b)
...
>>> df.withColumn('total', reduce(column_add, ( df[col] for col in df.columns ) )).collect()
[Row(a=1, b=2, c=3, total=6), Row(a=8, b=5, c=6, total=19), Row(a=3, b=1, c=0, total=4)]


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

  • 我有一个如下的数据帧: 我想将其转换为如下内容: B中重复的值是列名称,其值在C列中。我希望它们是数据帧的列 事实上,数据集是通过展平一棵树创建的,其中有更多的列,每个列都是一个内部节点。第一列是根,C是叶 以下是我的一些尝试: 然而,它不起作用。

  • 问题内容: 我在python / pyspark中有一个带有列的数据框 ,依此类推...... 现在,我在此数据框中添加了新列。 现在,我必须安排这样的列的列来后 我已经完成如下 我收到此错误 为什么会发生此错误。我该如何纠正。 问题答案: 您可以用来更改列的顺序:

  • 问题内容: 我试图基于一个的数据创建“ n” 。我正在检查in的Integer值,并循环执行sql语句以创建与列中一样多的“ n” 。 这是我的代码: 我需要创建“ n”,但我不知道如何在循环之前声明类型并在for内填充。 现有数据类型: 新的数据类型: 问题答案: 您可以创建一个可变列表并填充它: 但是更好的方法(不使用可变数据结构)是将整数列表 映射 到DataFrames列表中:

  • 我在pyspark中有一个有100多列的数据帧。我要做的是,对于所有的列名,我希望在列名的开头和结尾添加反勾(`)。 例如: 在pyspark/python中有没有这样做的方法。当我们应用代码时,它应该返回一个数据帧。

  • 很容易将列表列表转换为数据帧: 但是我如何将df转换回列表列表呢?