在数据框的所有行上应用函数[重复]

Posted

技术标签:

【中文标题】在数据框的所有行上应用函数[重复]【英文标题】:Apply function on all rows of dataframe [duplicate] 【发布时间】:2019-08-09 10:24:05 【问题描述】:

我想对 DataFrame 的所有行应用一个函数。 示例:

|A  |B   |C   |
|1  |3   |5   |
|6  |2   |0   |
|8  |2   |7   |
|0  |9   |4   |


Myfunction(df)

Myfunction(df: DataFrame):
//Apply sum of columns on each row

想要的输出:

1+3+5 = 9
6+2+0 = 8
...

请问 Scala 是怎么做到的?我关注了this,但没有运气。

【问题讨论】:

能否也分享一下输出/预期的数据框? 我刚刚编辑了我的问题 @AbderrahmenM 根据您的要求编辑了我的答案,但我仍然建议使用第一种方法(通过创建一个新列)。 【参考方案1】:

这很简单。你不需要为此编写任何函数,你可以做的就是通过总结你想要的所有列来创建一个新列。

scala> df.show
+---+---+---+
|  A|  B|  C|
+---+---+---+
|  1|  2|  3|
|  1|  2|  4|
|  1|  2|  5|
+---+---+---+


scala> df.withColumn("sum",col("A")+col("B")+col("C")).show
+---+---+---+---+
|  A|  B|  C|sum|
+---+---+---+---+
|  1|  2|  3|  6|
|  1|  2|  4|  7|
|  1|  2|  5|  8|
+---+---+---+---+

已编辑:

您可以在每一行上运行map 函数并使用行索引/字段名称获取总和。

scala> df.map(x=>x.getInt(0) + x.getInt(1) + x.getInt(2)).toDF("sum").show
+---+
|sum|
+---+
|  6|
|  7|
|  8|
+---+


scala> df.map(x=>x.getInt(x.fieldIndex("A")) + x.getInt(x.fieldIndex("B")) + x.getInt(x.fieldIndex("C"))).toDF("sum").show
+---+
|sum|
+---+
|  6|
|  7|
|  8|
+---+

【讨论】:

谢谢,但我想通过这个问题知道如何逐行“解析”DF @Goldie 你不应该使用fieldIndex,而应该使用getInt 和索引。如果您真的想使用名称访问,只需像 x.getInt(x.fieldIndex("A")) 这样组合即可 @Rafaël 骗我!感谢您指出了这一点。我将编辑我的答案。 @Goldie 不用担心 ;)【参考方案2】:

Map 是如果您想将函数应用于数据帧的每一行的解决方案。对于每一行,您可以返回一个元组并创建一个新的 RDD。

这在使用 Dataset 或 RDD 时非常完美,但不适用于 Dataframe。对于您的用例和 Dataframe,我建议您只添加一列并使用列对象来做您想做的事情。

// Using expr
df.withColumn("TOTAL", expr("A+B+C"))
// Using columns
df.withColumn("TOTAL", col("A")+col("B")+col("C"))
// Using dynamic selection of all columns
df.withColumn("TOTAL", df.colums.map(col).reduce((c1, c2) => c1 + c2))

在这种情况下,您会对this question 非常感兴趣。 UDF 也是一个很好的解决方案,更好地解释here。

如果您不想保留源列,可以将.withColumn(name, value) 替换为.select(value.alias(name))

【讨论】:

以上是关于在数据框的所有行上应用函数[重复]的主要内容,如果未能解决你的问题,请参考以下文章

显示 Pandas 数据框的所有行和列 [重复]

在非常大的文件C#的所有行上循环[重复]

对熊猫数据框的列应用差异[重复]

如何找到所有数据框的最大值,最小值[不是列值,也不是行] [重复]

聚合而不减少数据框的维度[重复]

需要将多个文本框的TextBox_LostFocus的重复代码缩减为一个函数