Pandas中如何用另一DataFrame对应行列值填充目标DataFrame的NaN?
解决用df_2填充df_1中NaN值的问题
你尝试用df_1.fillna(df_2)无法成功填充NaN,核心原因是默认的fillna依赖行索引+列名的严格匹配,若实际数据中df_2与df_1的行索引并非一一对应(比如行顺序不一致),就会填充失败。从你的示例来看,正确的匹配逻辑应该是基于A列的值关联数据,而非行索引。
解决方法
方法1:按A列对齐后填充
将A列设为索引,让两个DataFrame基于A列的值匹配,再执行填充操作:
import pandas as pd import numpy as np # 原始数据 df_1 = pd.DataFrame([ [0.1, 2, 55, 0,np.nan], [0.2, 4, np.nan, 1,99], [0.3, np.nan, 22, 5,88], [0.4, np.nan, np.nan, 4,77] ], columns=list('ABCDE')) df_2 = pd.DataFrame([ [0.1, 2, 55, 0.5], [0.2, 4, 6, 1], [0.3, 7, 22, 5], ], columns=list('ABCD')) # 基于A列对齐并填充 df_1 = df_1.set_index('A').fillna(df_2.set_index('A')).reset_index() print(df_1)
运行后输出与你期望的一致:
A B C D E 0 0.1 2.0 55.0 0 NaN 1 0.2 4.0 6.0 1 99.0 2 0.3 7.0 22.0 5 88.0 3 0.4 NaN NaN 4 77.0
方法2:使用combine_first(效果等价)
combine_first同样可以用df_2的非NaN值填充df_1的NaN,逻辑与按索引填充一致:
df_1 = df_1.set_index('A').combine_first(df_2.set_index('A')).reset_index()
原代码失效的原因
如果你的示例中直接用df_1.fillna(df_2)没生效,大概率是行索引未对齐——比如实际数据里df_2的行顺序和df_1不匹配(例如df_2中A=0.3的行不是索引2),此时按行索引填充无法找到对应值。通过A列作为索引,就能确保基于业务主键(A列值)匹配填充,不受行顺序影响。
内容的提问来源于stack exchange,提问作者EMT
相关产品推荐
相关产品推荐

