在数据框的所有行上应用函数[重复]
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))
【讨论】:
以上是关于在数据框的所有行上应用函数[重复]的主要内容,如果未能解决你的问题,请参考以下文章