如何用其他数据框的值填充缺失值

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 替换缺失值?

pandas如何实现缺失的行数据按上一行数据进行填充?

在 pandas 数据帧中使用前向和后向填充填充缺失值(ffill 和 bfill)

如何用相邻值替换数据框中的 NA(缺失值)

R语言-均值填充缺失值