如何用其他数据框的值填充缺失值
Posted
技术标签:
【中文标题】如何用其他数据框的值填充缺失值【英文标题】:How to fill missing values with values from other dataframes 【发布时间】:2016-09-24 15:13:28 【问题描述】:我有一个数据框,其中包含一个 ID:String 列、一个 Type:Int 列和一个 Name:String 列。
这个数据框的名称列有很多缺失值。
但我还有其他三个包含 ID 列和名称列的数据框。
我想做的是用其他数据框中的值填充第一个数据框中的缺失值。其他数据帧不包含属于第一个数据帧的所有 ID,而且它们还可以包含第一个数据帧中不存在的 ID。
在这种情况下,正确的方法是什么?我知道我可以组合两个 DF,例如:
df1.join(df2, df1("ID")===df2("ID"), "left_outer")
但由于我知道 type=2 的第一个数据帧中的所有条目都已经有了名称,所以我想将此连接限制为仅用于 type=1 的行
知道如何从三个 DF 中检索 Names 值以填充原始数据框中的 Name 列吗?
【问题讨论】:
【参考方案1】:您可以拆分 join
感兴趣的子集并将所有内容收集回来:
df1
// Select ones that may require filling
.where($"type" === 1)
// Join
.join(df2, Seq("ID"), "left_outer")
// Replace NULL if needed
.select($"ID", $"Type", coalesce(df1("Name"), df2("Name")).alias("Name"))
// Union with subset which doesn't require filling
.union(df1.where($"type" === 2)) // Or =!= 1 as suggested by @AlbertoBonsanto
如果type
列是nullable
,你应该用union($"type".isNull)
单独覆盖这个场景。
【讨论】:
我会说df1.where($"type" !== 1)
@AlbertoBonsanto 我考虑过,但如果它是二元选择,那么===
更有可能被优化(通过分区修剪或下推)还有=!=
。 !==
已被弃用。
谢谢!正如我在问题中所问的那样,我有三个 DF……你有什么建议,只需重复三遍?
我真的没有看到其他选项。以上是关于如何用其他数据框的值填充缺失值的主要内容,如果未能解决你的问题,请参考以下文章
Csr 矩阵:如何用 np.nan 而不是 0 替换缺失值?