如何基于匹配ID用另一DataFrame的值替换DataFrame中的缺失值?
用小型DataFrame匹配ID填充大型DataFrame缺失值的最优方法
直接用pandas的向量化操作即可,完全不需要遍历行——这类操作底层基于C实现,效率比Python循环高几个数量级,尤其适合大型数据集。针对你的示例,推荐两种高效实现方式:
方法一:使用combine_first
该方法会用第二个DataFrame中的非缺失值填充第一个DataFrame的缺失值,自动按索引匹配:
import pandas as pd import numpy as np df1 = pd.DataFrame({"A": [1, 2, 3, 4, 5], "B": ["a", np.nan, "c", "d", np.nan]}) df2 = pd.DataFrame({"A": [2, 5], "B": ["b", "e"]}) # 将ID列(A)设为索引,实现精准匹配 df1_idx = df1.set_index("A") df2_idx = df2.set_index("A") # 填充缺失值后恢复原索引结构 df_filled = df1_idx.combine_first(df2_idx).reset_index() print(df_filled)
输出结果:
A B 0 1 a 1 2 b 2 3 c 3 4 d 4 5 e
方法二:使用update
如果需要直接修改原大型DataFrame(df1),可以用update方法——它会用df2中的值覆盖df1对应位置的缺失值:
import pandas as pd import numpy as np df1 = pd.DataFrame({"A": [1, 2, 3, 4, 5], "B": ["a", np.nan, "c", "d", np.nan]}) df2 = pd.DataFrame({"A": [2, 5], "B": ["b", "e"]}) # 设置索引对齐 df1.set_index("A", inplace=True) df2.set_index("A", inplace=True) # 直接更新df1的缺失值 df1.update(df2) # 恢复原索引 df1.reset_index(inplace=True) print(df1)
输出结果和方法一完全一致。
注意事项
- 确保两个DataFrame的ID列(示例中的"A")值类型一致,避免匹配失败
- 如果需要填充多列,这两种方法都支持自动匹配列名,无需额外处理
内容的提问来源于stack exchange,提问作者MKJ
相关产品推荐
相关产品推荐

