You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用另一个DataFrame填充Python中DataFrame的NA值?

用df2填充df1中NaN值的可行解决方案

我来帮你搞定这个问题!你提到用update和combine_first没成功,大概率是没摸透这两个方法的细节,或者你的DataFrame结构有特殊情况。我给你拆解一下问题,并提供靠谱的代码方案。

先说说你之前方法失败的原因

  • df1.update(df2)的坑:这个方法是原地修改df1,不会返回新的DataFrame——所以你直接赋值给df3的话,得到的会是None!另外它的逻辑是用df2的非NaN值覆盖df1对应索引+列位置的所有值(不管df1原来是不是NaN),不是只填充空值,这可能和你的需求不符。
  • df1.combine_first(df2)没生效?:这个方法本身是对的,但如果结果不对,大概率是df1和df2的索引/列没对齐,或者你误解了它的逻辑——它是用df2的非NaN值填充df1的NaN,同时保留df1原本的非NaN值和额外列。

可行代码方案(附示例)

先构造两个示例DataFrame模拟你的场景:

import pandas as pd
import numpy as np

# 示例df1:包含需要填充的NaN
df1 = pd.DataFrame({
    'A': [1, np.nan, 3, np.nan],
    'B': [np.nan, 5, np.nan, 7],
    'C': [9, 10, 11, 12]
}, index=[0, 1, 2, 3])

# 示例df2:用来填充df1的数据源
df2 = pd.DataFrame({
    'A': [2, 4],
    'B': [4, 6]
}, index=[1, 3])

方案1:用fillna(最直观,推荐)

fillna可以直接指定用df2来填充,会自动对齐索引和列,只填充df1中的NaN:

df3 = df1.fillna(df2)
print(df3)

输出结果:

A    B   C
0  1.0  NaN   9
1  2.0  5.0  10
2  3.0  NaN  11
3  4.0  7.0  12

方案2:用combine_first(逻辑清晰)

这个方法的逻辑是“优先用df1的值,df1是NaN的地方用df2的值”,同样会自动对齐索引和列:

df3 = df1.combine_first(df2)
print(df3)

输出和上面的结果完全一致。

如果你非要用update(不推荐,除非需要覆盖非NaN值)

如果一定要用update,记得先复制df1,再原地修改:

df3 = df1.copy()
df3.update(df2)
print(df3)

⚠️ 注意:这个方法会覆盖df1中对应位置的所有值(不管是不是NaN),比如示例中df1的B列索引1位置原本是5,df2中B列索引1是4,用update后会被改成4,这可能不是你想要的。

关键提醒

如果你的df1和df2的索引或列不完全匹配,上面的方法都会自动对齐,只填充匹配的位置。如果需要忽略索引/列,直接按位置填充,可以用:

df3 = df1.fillna(df2.values)

但这种场景比较少见,一般推荐优先用索引+列对齐的方式,避免数据错位。

内容的提问来源于stack exchange,提问作者Vincent Lin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:17:07