【问题标题】:Applying map function on dataframe's columns在数据框的列上应用地图功能
【发布时间】:2020-10-21 12:37:05
【问题描述】:

我需要将数据框列的所有值合并为每列的单个值。所以列保持不变,但我只是将所有各自的值相加。 为此,我打算使用此功能:

def sum_col(data, col):
    return data.select(f.sum(col)).collect()[0][0]

我现在正在考虑这样做:

data = data.map(lambda current_col: sum_col(data, current_col))

这是可行的,还是我需要另一种方法来合并列的所有值?

【问题讨论】:

  • 您可以使用 udf 来做到这一点。 Custome 定义了一个函数,该函数可以通过将一个函数应用于 df 的结果生成另一列。

标签: python dataframe apache-spark pyspark


【解决方案1】:

你可以通过 sum 函数来实现

import pyspark.sql.functions as f
df.select(*[f.sum(cols).alias(cols) for cols in df.columns]).show()

+----+---+---+
|val1|  x|  y|
+----+---+---+
|  36| 29|159|
+----+---+---+

【讨论】:

    【解决方案2】:

    要将所有列汇总到一个新列中,您可以将列表推导与 python 的 sum 函数结合使用

    import pyspark.sql.functions as F
    from pyspark.sql.functions import udf
    from pyspark.sql.types import *
    tst= sqlContext.createDataFrame([(10,7,14),(5,1,4),(9,8,10),(2,6,90),(7,2,30),(3,5,11)],schema=['val1','x','y'])
    tst_sum= tst.withColumn("sum_col",sum([tst[coln] for coln in tst.columns]))
    

    结果:

    tst_sum.show()
    +----+---+---+-------+
    |val1|  x|  y|sum_col|
    +----+---+---+-------+
    |  10|  7| 14|     31|
    |   5|  1|  4|     10|
    |   9|  8| 10|     27|
    |   2|  6| 90|     98|
    |   7|  2| 30|     39|
    |   3|  5| 11|     19|
    +----+---+---+-------+
    

    注意:如果您从 pyspark 函数中导入 sum 函数为 from import pyspark.sql.functions import sum,那么您必须将名称更改为其他名称,例如 from import pyspark.sql.functions import sum_pyspark

    【讨论】:

    • 感谢您的回答。但是,我需要为每一列获取一个值。在这种情况下,val1 应该有 1 个值,即 36(val1 所有值的总和为 36)。因此,我需要将 val1 的值替换为单个值,该值是所有原始值的总和。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-05
    • 1970-01-01
    • 1970-01-01
    • 2020-03-05
    • 1970-01-01
    • 2015-08-21
    • 1970-01-01
    相关资源
    最近更新 更多