scala - 使用 Scala 以优化的方式将 NA 值替换为“0”
问题描述
我的输入spark-dataframe
命名df
为,
+---------------+----+----+----+
|Main_CustomerID| P1| P2| P3|
+---------------+----+----+----+
| 101| 1|null| 2|
| 102|null|null| 3|
| 103| 1| 1|null|
+---------------+----+----+----+
我需要替换asnull
的值。我通过以下方式实现了这一目标,df
0
val columnsListSeq = df.columns.toSeq
var newDF = df
for (index <- columnsListSeq) {
newDF = newDF.na.fill(0, Seq(index))
}
我的结果dataframe
是,
+---------------+---+---+---+
|Main_CustomerID| P1| P2| P3|
+---------------+---+---+---+
| 101| 1| 0| 2|
| 102| 0| 0| 3|
| 103| 1| 1| 0|
+---------------+---+---+---+
但我需要使用比这更优化的解决方案for loop
。我怎样才能做到这一点?
解决方案
DataFrameNaFunctions
伴随
def fill(value: T, cols: Array[String]): DataFrame
和
def fill(value: T): DataFrame
它可以分别填充列的子集(用 表示cols
)和所有列。
然而,这里没有性能改进——只有更简洁的代码。
关于您的评论:
当我尝试这个时, df.na.fill(0) 我没有将它分配给一个新的数据框。所以df没有变化。通过分配给一个新的数据框,我可以看到变化。
DataFrames
是不可变的。您的代码不会修改它只是覆盖现有对象var
。如上所述,这里没有性能改进。
推荐阅读
- machine-learning - MIMIC-III 数据集中的特征选择
- reactjs - mongodb 有效地获取更新
- python - 如何在 Python 中计算 mpeg2/crc32?
- android - 错误:FAILURE:尝试向 Flutter 验证 FireBase 时构建失败并出现异常
- sql - 如何更新两个相同的行,其中一个具有不同的值
- android - 当深层链接重新打开片段状态时,如何保留片段状态?
- rust - 将流式未来对象的主体保存到磁盘
- python - Pandas - 在扩展日期窗口中计算组的平均值
- javascript - 事件处理程序中的关闭
- android - 如何在 Android Studio 中使用 VolleyMutlipart 在一个请求中发布多个文件?