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

基于多列匹配用另一DataFrame填充当前DataFrame NA值的高效方法

多列匹配场景下使用一个DataFrame填充另一个DataFrame空值的高效方法

最优实现方案

针对city、rooms两列匹配填充rent空值的场景,性能最高的实现方式是基于多级索引构建映射表,通过向量化操作完成批量填充,全程无循环开销,在大数据量下优势尤其明显:

import pandas as pd
import numpy as np

# 示例数据构造
d1 = {'city' : ['New York', 'Shanghai', 'Boston', 'Shanghai', 'Shanghai'],
      'rooms': ["1","2","3","2","2"], 
      'floor': ["4","5","6","10","8"], 
      'rent': [500, np.nan, 1500, 2000, np.nan]}
d2 = {'city' : ['Shanghai'],
      'rooms': ["2"], 
      'rent': [1000]}
df1 = pd.DataFrame(data = d1)
df2 = pd.DataFrame(data = d2)

# 核心填充逻辑
fill_map = df2.set_index(['city', 'rooms'])['rent']
df1['rent'] = df1['rent'].fillna(df1.set_index(['city', 'rooms']).index.map(fill_map))

执行后得到的df1和预期结果完全一致。

方案逻辑说明

  • 第一步将填充用的df2的匹配列设为多级索引,提取待填充字段生成映射表,时间复杂度为O(m),m为df2的行数
  • 第二步将主表df1的匹配列也转为相同结构的多级索引,通过map方法批量匹配到对应的填充值,再用fillna替换原列中的空值,所有操作均为pandas内置的向量化运算,远快于逐行判断的写法。

可选实现方案

如果后续需要同时填充多个字段,也可以使用merge方案,可读性更高,仅在超大规模数据集下性能略低于映射方案:

df1 = df1.merge(df2, on=['city', 'rooms'], how='left', suffixes=('', '_fill'))
# 填充所有需要补全的列,有多个列时依次处理即可
df1['rent'] = df1['rent'].fillna(df1['rent_fill'])
# 删除临时生成的填充列
df1 = df1.drop(columns=['rent_fill'])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 13:00:03