如何用另一个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
相关产品推荐
相关产品推荐

