【问题标题】:Pandas fill missing values in dataframe from another dataframe熊猫从另一个数据框中填充数据框中的缺失值
【发布时间】:2021-12-10 17:13:19
【问题描述】:

我找不到一个 pandas 函数(我以前见过)用另一个数据帧中的值替换数据帧中的 NaN(假设可以指定一个公共索引)。有什么帮助吗?

【问题讨论】:

  • 听起来你想要合并。请展示一些示例场景。
  • 找到了!我想使用 combine_first
  • fillna 有一个value 参数,可用于按公共索引映射缺失值,但这需要参数类型为Series 或dict,而不是DataFrame。

标签: python pandas


【解决方案1】:

如果你有两个相同形状的 DataFrame,那么:

df[df.isnull()] = d2

会成功的。

只有df.isnull() 评估为True(以绿色突出显示)的位置才有资格分配。

在实践中,DataFrame 的大小/形状并不总是相同,转换方法(尤其是 .shift())很有用。

传入的数据总是脏的、不完整的或不一致的。课程标准杆。有一个相当广泛的 pandas tutorial and associated cookbook 可以处理这些情况。

【讨论】:

  • 注意,您可能需要执行以下操作:df[df.isnull()] = d2.values
【解决方案2】:

正如我刚刚了解到的,有一个 DataFrame.combine_first() 方法正是这样做的,其附加属性是,如果您更新的数据框 d2 大于您原来的 df,则添加额外的行和列,以及。

df = df.combine_first(d2)

【讨论】:

    【解决方案3】:

    这应该很简单

    df.fillna(d2)
    

    【讨论】:

    • 2021年最干净的解决方案,应该是公认的答案。请注意,两个数据框中的列名必须相同。
    【解决方案4】:

    一个专门的方法是DataFrame.update:

    引用自文档:

    使用来自另一个 DataFrame 的非 NA 值进行就地修改。
    对齐索引。没有返回值。

    需要注意的是,此方法会就地修改您的数据。所以它会覆盖你更新的数据框。

    示例:

    print(df1)
           A    B     C
    aaa  NaN  1.0   NaN
    bbb  NaN  NaN  10.0
    ccc  3.0  NaN   6.0
    ddd  NaN  NaN   NaN
    eee  NaN  NaN   NaN
    
    print(df2)
             A    B     C
    index                
    aaa    1.0  1.0   NaN
    bbb    NaN  NaN  10.0
    eee    NaN  1.0   NaN
    
    # update df1 NaN where there are values in df2
    df1.update(df2)
    print(df1)
           A    B     C
    aaa  1.0  1.0   NaN
    bbb  NaN  NaN  10.0
    ccc  3.0  NaN   6.0
    ddd  NaN  NaN   NaN
    eee  NaN  1.0   NaN
    

    请注意在aaa, A 和eee, B 相交处更新的NaN 值

    【讨论】:

      【解决方案5】:

      DataFrame.combine_first() 准确回答了这个问题。

      但是,有时您想用 DataFrame B 中的值填充/替换/覆盖 DataFrame A 的一些非缺失(非 NaN)值。这个问题把我带到了这个页面,解决方案是 DataFrame.mask()

      A = B.mask(condition, A)
      

      当condition 为真时,将使用来自 A 的值,否则将使用 B 的值。

      例如,您可以使用 mask 解决 OP 的原始问题,这样当 A 中的元素为非 NaN 时,使用它,否则使用 B 中的相应元素。

      但是使用DataFrame.mask(),您可以用来自 B 的值替换不符合任意标准(小于零?大于 100?)的 A 的值。因此,mask 更灵活,并且对于这个问题过度杀伤,但我认为值得一提(我需要它来解决我的问题)。

      同样重要的是要注意 B 可能是一个 numpy 数组而不是 DataFrame。 DataFrame.combine_first() 要求 B 是 DataFrame,但 DataFrame.mask() 只要求 B 是 NDFrame 并且其尺寸与 A 的尺寸匹配。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-06-06
        • 1970-01-01
        • 1970-01-01
        • 2017-08-21
        • 1970-01-01
        • 2016-04-30
        • 2019-08-01
        相关资源
        最近更新 更多